From 2a722c8a3b86dc7fb8f71113d6bf06d8f3fb050e Mon Sep 17 00:00:00 2001 From: Evgenii Kanivets Date: Tue, 28 Jun 2016 11:27:37 +0300 Subject: [PATCH 1/4] #69[1h]. Update export format. --- .../moneytracker/activity/ExportActivity.java | 6 +- .../activity/record/AddRecordActivity.java | 15 ++++ .../controller/ExportController.java | 74 +++++++++++++++++++ .../controller/data/RecordController.java | 39 ---------- .../di/module/ControllerModule.java | 9 +++ .../controller/data/RecordControllerTest.java | 7 -- 6 files changed, 101 insertions(+), 49 deletions(-) create mode 100644 app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/ExportController.java diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/ExportActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/ExportActivity.java index 7fd3cad..c28b6e0 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/ExportActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/ExportActivity.java @@ -7,7 +7,7 @@ import com.blogspot.e_kanivets.moneytracker.R; import com.blogspot.e_kanivets.moneytracker.activity.base.BaseBackActivity; -import com.blogspot.e_kanivets.moneytracker.controller.data.RecordController; +import com.blogspot.e_kanivets.moneytracker.controller.ExportController; import java.io.File; import java.io.FileNotFoundException; @@ -26,7 +26,7 @@ public class ExportActivity extends BaseBackActivity { private static final String DEFAULT_EXPORT_FILE_NAME = "money_tracker.csv"; @Inject - RecordController recordController; + ExportController exportController; @Override protected int getContentViewId() { @@ -42,7 +42,7 @@ protected boolean initData() { @OnClick(R.id.btn_export) public void exportRecords() { - List records = recordController.getRecordsForExport(0, Long.MAX_VALUE); + List records = exportController.getRecordsForExport(0, Long.MAX_VALUE); File exportDir = new File(getCacheDir(), "export"); boolean exportDirCreated = exportDir.mkdirs(); diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/record/AddRecordActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/record/AddRecordActivity.java index eb14cd8..6c46889 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/record/AddRecordActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/record/AddRecordActivity.java @@ -5,6 +5,8 @@ import android.os.Build; import android.support.annotation.Nullable; import android.support.v7.widget.AppCompatSpinner; +import android.text.InputFilter; +import android.text.Spanned; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; @@ -153,6 +155,10 @@ public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { return false; } }); + + // Restrict ';' for input, because it's used as delimiter when exporting + etTitle.setFilters(new InputFilter[]{new SemicolonInputFilter()}); + etCategory.setFilters(new InputFilter[]{new SemicolonInputFilter()}); } @Override @@ -270,4 +276,13 @@ private boolean doRecord(String title, String category, double price, @Nullable } public enum Mode {MODE_ADD, MODE_EDIT} + + private static class SemicolonInputFilter implements InputFilter { + + @Override + public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { + if (source != null && ";".equals(source.toString())) return ""; + else return null; + } + } } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/ExportController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/ExportController.java new file mode 100644 index 0000000..6b3b29c --- /dev/null +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/ExportController.java @@ -0,0 +1,74 @@ +package com.blogspot.e_kanivets.moneytracker.controller; + +import com.blogspot.e_kanivets.moneytracker.controller.data.CategoryController; +import com.blogspot.e_kanivets.moneytracker.controller.data.RecordController; +import com.blogspot.e_kanivets.moneytracker.entity.data.Category; +import com.blogspot.e_kanivets.moneytracker.entity.data.Record; +import com.blogspot.e_kanivets.moneytracker.repo.DbHelper; + +import java.util.ArrayList; +import java.util.List; + +/** + * Controller class to encapsulate export logic. + * Created on 6/28/16. + * + * @author Evgenii Kanivets + */ +public class ExportController { + private static final String HEAD_TIME = "time"; + private static final String HEAD_TITLE = "title"; + private static final String HEAD_CATEGORY = "category"; + private static final String HEAD_PRICE = "price"; + private static final String HEAD_CURRENCY = "currency"; + private static final String DELIMITER = ";"; + + private final RecordController recordController; + private final CategoryController categoryController; + + public ExportController(RecordController recordController, CategoryController categoryController) { + this.recordController = recordController; + this.categoryController = categoryController; + } + + public List getRecordsForExport(long fromDate, long toDate) { + List result = new ArrayList<>(); + + /* First of all add a header */ + @SuppressWarnings("StringBufferReplaceableByString") + StringBuilder sb = new StringBuilder(); + sb.append(HEAD_TIME).append(DELIMITER); + sb.append(HEAD_TITLE).append(DELIMITER); + sb.append(HEAD_CATEGORY).append(DELIMITER); + sb.append(HEAD_PRICE).append(DELIMITER); + sb.append(HEAD_CURRENCY); + + result.add(sb.toString()); + + String condition = DbHelper.TIME_COLUMN + " BETWEEN ? AND ?"; + String[] args = new String[]{Long.toString(fromDate), Long.toString(toDate)}; + + List recordList = recordController.readWithCondition(condition, args); + + 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 = null; + if (record.getCategory() != null) + category = categoryController.read(record.getCategory().getId()); + + sb.append(category == null ? "NONE" : category.getName()).append(DELIMITER); + sb.append(record.getType() == 0 ? record.getFullPrice() + : -record.getFullPrice()).append(DELIMITER); + sb.append(record.getCurrency() == null ? DbHelper.DEFAULT_ACCOUNT_CURRENCY + : record.getCurrency()); + + result.add(sb.toString()); + } + + return result; + } +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordController.java index b3bbf22..458eb9f 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordController.java @@ -117,45 +117,6 @@ public List getRecordsForPeriod(Period period) { return readWithCondition(condition, args); } - public List getRecordsForExport(long fromDate, long toDate) { - final String DELIMITER = ";"; - List result = new ArrayList<>(); - - /* First of all add a header */ - @SuppressWarnings("StringBufferReplaceableByString") - StringBuilder sb = new StringBuilder(); - sb.append(DbHelper.ID_COLUMN).append(DELIMITER); - sb.append(DbHelper.TIME_COLUMN).append(DELIMITER); - sb.append(DbHelper.TITLE_COLUMN).append(DELIMITER); - sb.append(DbHelper.CATEGORY_ID_COLUMN).append(DELIMITER); - sb.append(DbHelper.PRICE_COLUMN); - - result.add(sb.toString()); - - String condition = DbHelper.TIME_COLUMN + " BETWEEN ? AND ?"; - String[] args = new String[]{Long.toString(fromDate), Long.toString(toDate)}; - - List recordList = readWithCondition(condition, args); - - 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 = null; - if (record.getCategory() != null) - category = categoryController.read(record.getCategory().getId()); - - sb.append(category == null ? "NONE" : category.getName()).append(DELIMITER); - sb.append(record.getType() == 0 ? record.getPrice() : -record.getPrice()); - - result.add(sb.toString()); - } - - return result; - } - private Record validateRecord(@NonNull Record record) { if (record.getCategory() == null) return record; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/ControllerModule.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/ControllerModule.java index fbba9b1..a5b2156 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/ControllerModule.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/ControllerModule.java @@ -3,6 +3,7 @@ import android.content.Context; import android.support.annotation.NonNull; +import com.blogspot.e_kanivets.moneytracker.controller.ExportController; import com.blogspot.e_kanivets.moneytracker.controller.FormatController; import com.blogspot.e_kanivets.moneytracker.controller.PeriodController; import com.blogspot.e_kanivets.moneytracker.controller.data.AccountController; @@ -105,4 +106,12 @@ public PeriodController providesPeriodController(PreferenceController preference public FormatController providesFormatController(PreferenceController preferenceController) { return new FormatController(preferenceController); } + + @Provides + @NonNull + @Singleton + public ExportController providesExportController(RecordController recordController, + CategoryController categoryController) { + return new ExportController(recordController, categoryController); + } } diff --git a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordControllerTest.java b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordControllerTest.java index ae7ee43..d9a4020 100644 --- a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordControllerTest.java +++ b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordControllerTest.java @@ -142,13 +142,6 @@ public void testGetRecordsForPeriod() throws Exception { new Period(new Date(), new Date(), Period.TYPE_CUSTOM))); } - @Test - public void testGetRecordsForExport() throws Exception { - ArrayList expected = new ArrayList<>(); - expected.add("id;time;title;category_id;price"); - assertEquals(expected, recordController.getRecordsForExport(0, 1)); - } - private class TestRepo implements IRepo { private Map recordHashMap = new HashMap<>(); From c8ae2fc74cdb0045bb3b14f940ea991cc1feae1a Mon Sep 17 00:00:00 2001 From: Evgenii Kanivets Date: Tue, 28 Jun 2016 11:40:14 +0300 Subject: [PATCH 2/4] #69[30m]. Sort records by time column on Controller level. --- .../moneytracker/controller/ExportController.java | 1 - .../moneytracker/controller/data/RecordController.java | 10 ++++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/ExportController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/ExportController.java index 6b3b29c..ee4f996 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/ExportController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/ExportController.java @@ -52,7 +52,6 @@ public List getRecordsForExport(long fromDate, long toDate) { 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); diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordController.java index 458eb9f..a17b984 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/RecordController.java @@ -12,6 +12,8 @@ import com.blogspot.e_kanivets.moneytracker.repo.base.IRepo; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.List; /** @@ -90,6 +92,14 @@ public List readAll() { public List readWithCondition(String condition, String[] args) { List recordList = super.readWithCondition(condition, args); + // Sort record list by time field from smallest to biggest + Collections.sort(recordList, new Comparator() { + @Override + public int compare(Record lhs, Record rhs) { + return lhs.getTime() < rhs.getTime() ? -1 : (lhs.getTime() == rhs.getTime() ? 0 : 1); + } + }); + // Data read from DB through Repo layer doesn't contain right nested objects, so construct them List completedRecordList = new ArrayList<>(); for (Record record : recordList) { From e64c870ce94b03a0b625a8f389160a761c2484b2 Mon Sep 17 00:00:00 2001 From: Evgenii Kanivets Date: Tue, 28 Jun 2016 13:02:12 +0300 Subject: [PATCH 3/4] #69[1h]. Add import feature. --- app/src/main/AndroidManifest.xml | 5 ++ .../moneytracker/activity/ExportActivity.java | 2 +- .../moneytracker/activity/ImportActivity.java | 45 +++++++++++ .../activity/base/BaseDrawerActivity.java | 11 +++ .../{ => external}/ExportController.java | 27 +++---- .../controller/external/Head.java | 17 +++++ .../controller/external/ImportController.java | 70 ++++++++++++++++++ .../moneytracker/di/AppComponent.java | 3 + .../di/module/ControllerModule.java | 10 ++- .../main/res/drawable-xxxhdpi/ic_import.png | Bin 0 -> 802 bytes app/src/main/res/layout/activity_import.xml | 52 +++++++++++++ app/src/main/res/menu/menu_nav_drawer.xml | 4 + app/src/main/res/values-ru/strings.xml | 3 + app/src/main/res/values-uk/strings.xml | 3 + app/src/main/res/values/strings.xml | 3 + 15 files changed, 236 insertions(+), 19 deletions(-) create mode 100644 app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/ImportActivity.java rename app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/{ => external}/ExportController.java (70%) create mode 100644 app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/Head.java create mode 100644 app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ImportController.java create mode 100755 app/src/main/res/drawable-xxxhdpi/ic_import.png create mode 100644 app/src/main/res/layout/activity_import.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5054471..752df1f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -73,6 +73,11 @@ android:label="@string/title_charts" android:screenOrientation="portrait" android:theme="@style/Theme.Default" /> + recordList = importController.importRecordsFromCsv(data); + showToast(getString(R.string.records_imported, recordList.size())); + + setResult(RESULT_OK); + finish(); + } +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseDrawerActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseDrawerActivity.java index afdd7e1..8e29191 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseDrawerActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseDrawerActivity.java @@ -11,6 +11,7 @@ import com.blogspot.e_kanivets.moneytracker.R; import com.blogspot.e_kanivets.moneytracker.activity.ChartsActivity; import com.blogspot.e_kanivets.moneytracker.activity.ExportActivity; +import com.blogspot.e_kanivets.moneytracker.activity.ImportActivity; import com.blogspot.e_kanivets.moneytracker.activity.SettingsActivity; import com.blogspot.e_kanivets.moneytracker.activity.account.AccountsActivity; import com.blogspot.e_kanivets.moneytracker.activity.exchange_rate.ExchangeRatesActivity; @@ -29,6 +30,7 @@ public abstract class BaseDrawerActivity extends BaseActivity private static final int REQUEST_ACCOUNTS = 1; private static final int REQUEST_RATES = 2; private static final int REQUEST_SETTINGS = 3; + private static final int REQUEST_IMPORT = 4; @Bind(R.id.drawer_layout) DrawerLayout drawer; @@ -82,6 +84,11 @@ public boolean onNavigationItemSelected(MenuItem item) { startActivity(new Intent(BaseDrawerActivity.this, ChartsActivity.class)); break; + case R.id.nav_import: + startActivityForResult(new Intent(BaseDrawerActivity.this, ImportActivity.class), + REQUEST_IMPORT); + break; + case R.id.nav_export: startActivity(new Intent(BaseDrawerActivity.this, ExportActivity.class)); break; @@ -117,6 +124,10 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { update(); break; + case REQUEST_IMPORT: + update(); + break; + default: break; } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/ExportController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ExportController.java similarity index 70% rename from app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/ExportController.java rename to app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ExportController.java index ee4f996..8493275 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/ExportController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ExportController.java @@ -1,4 +1,4 @@ -package com.blogspot.e_kanivets.moneytracker.controller; +package com.blogspot.e_kanivets.moneytracker.controller.external; import com.blogspot.e_kanivets.moneytracker.controller.data.CategoryController; import com.blogspot.e_kanivets.moneytracker.controller.data.RecordController; @@ -16,13 +16,6 @@ * @author Evgenii Kanivets */ public class ExportController { - private static final String HEAD_TIME = "time"; - private static final String HEAD_TITLE = "title"; - private static final String HEAD_CATEGORY = "category"; - private static final String HEAD_PRICE = "price"; - private static final String HEAD_CURRENCY = "currency"; - private static final String DELIMITER = ";"; - private final RecordController recordController; private final CategoryController categoryController; @@ -37,11 +30,11 @@ public List getRecordsForExport(long fromDate, long toDate) { /* First of all add a header */ @SuppressWarnings("StringBufferReplaceableByString") StringBuilder sb = new StringBuilder(); - sb.append(HEAD_TIME).append(DELIMITER); - sb.append(HEAD_TITLE).append(DELIMITER); - sb.append(HEAD_CATEGORY).append(DELIMITER); - sb.append(HEAD_PRICE).append(DELIMITER); - sb.append(HEAD_CURRENCY); + sb.append(Head.TIME).append(Head.DELIMITER); + sb.append(Head.TITLE).append(Head.DELIMITER); + sb.append(Head.CATEGORY).append(Head.DELIMITER); + sb.append(Head.PRICE).append(Head.DELIMITER); + sb.append(Head.CURRENCY); result.add(sb.toString()); @@ -52,16 +45,16 @@ public List getRecordsForExport(long fromDate, long toDate) { for (Record record : recordList) { sb = new StringBuilder(); - sb.append(record.getTime()).append(DELIMITER); - sb.append(record.getTitle()).append(DELIMITER); + sb.append(record.getTime()).append(Head.DELIMITER); + sb.append(record.getTitle()).append(Head.DELIMITER); Category category = null; if (record.getCategory() != null) category = categoryController.read(record.getCategory().getId()); - sb.append(category == null ? "NONE" : category.getName()).append(DELIMITER); + sb.append(category == null ? "NONE" : category.getName()).append(Head.DELIMITER); sb.append(record.getType() == 0 ? record.getFullPrice() - : -record.getFullPrice()).append(DELIMITER); + : -record.getFullPrice()).append(Head.DELIMITER); sb.append(record.getCurrency() == null ? DbHelper.DEFAULT_ACCOUNT_CURRENCY : record.getCurrency()); diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/Head.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/Head.java new file mode 100644 index 0000000..396c9a3 --- /dev/null +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/Head.java @@ -0,0 +1,17 @@ +package com.blogspot.e_kanivets.moneytracker.controller.external; + +/** + * Interface for head titles in import/export features. + * Created on 6/28/16. + * + * @author Evgenii Kanivets + */ +public interface Head { + String TIME = "time"; + String TITLE = "title"; + String CATEGORY = "category"; + String PRICE = "price"; + String CURRENCY = "currency"; + String DELIMITER = ";"; + int COLUMN_COUNT = 5; +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ImportController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ImportController.java new file mode 100644 index 0000000..f0737e4 --- /dev/null +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/external/ImportController.java @@ -0,0 +1,70 @@ +package com.blogspot.e_kanivets.moneytracker.controller.external; + +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + +import com.blogspot.e_kanivets.moneytracker.controller.data.RecordController; +import com.blogspot.e_kanivets.moneytracker.entity.data.Account; +import com.blogspot.e_kanivets.moneytracker.entity.data.Category; +import com.blogspot.e_kanivets.moneytracker.entity.data.Record; + +import java.util.ArrayList; +import java.util.List; + +/** + * Controller class to encapsulate import logic. + * Created on 6/28/16. + * + * @author Evgenii Kanivets + */ +public class ImportController { + private final RecordController recordController; + + public ImportController(RecordController recordController) { + this.recordController = recordController; + } + + @NonNull + public List importRecordsFromCsv(@Nullable String csv) { + List recordList = new ArrayList<>(); + if (csv == null) return recordList; + + String lines[] = csv.split("\\r?\\n"); + for (String line : lines) { + String[] words = line.split(Head.DELIMITER); + if (words.length != Head.COLUMN_COUNT) continue; + + String timeCol = words[0]; + String titleCol = words[1]; + String categoryCol = words[2]; + String priceCol = words[3]; + String currencyCol = words[4]; + + try { + long time = Long.parseLong(timeCol); + String title = titleCol.trim(); + String categoryName = categoryCol.trim(); + double price = Double.parseDouble(priceCol); + String currency = currencyCol.trim(); + + if (currency.length() != 3) continue; + if (categoryName.isEmpty()) continue; + + int type; + if (price < 0.0) type = Record.TYPE_EXPENSE; + else type = Record.TYPE_INCOME; + + Category category = new Category(categoryName); + Account account = new Account(-1, "MOCK", -1, currency, 0); + + Record record = new Record(time, type, title, category, Math.abs(price), account, currency); + Record createdRecord = recordController.create(record); + if (createdRecord != null) recordList.add(createdRecord); + } catch (Exception e) { + e.printStackTrace(); + } + } + + return recordList; + } +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/AppComponent.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/AppComponent.java index 019e9ac..17b0a71 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/AppComponent.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/AppComponent.java @@ -2,6 +2,7 @@ import com.blogspot.e_kanivets.moneytracker.activity.ChartsActivity; import com.blogspot.e_kanivets.moneytracker.activity.ExportActivity; +import com.blogspot.e_kanivets.moneytracker.activity.ImportActivity; import com.blogspot.e_kanivets.moneytracker.activity.ReportActivity; import com.blogspot.e_kanivets.moneytracker.activity.SettingsActivity; import com.blogspot.e_kanivets.moneytracker.activity.account.AccountsActivity; @@ -48,6 +49,8 @@ public interface AppComponent { void inject(TransferActivity transferActivity); + void inject(ImportActivity importActivity); + void inject(ExportActivity exportActivity); void inject(ReportActivity reportActivity); diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/ControllerModule.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/ControllerModule.java index a5b2156..48163b5 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/ControllerModule.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/di/module/ControllerModule.java @@ -3,7 +3,7 @@ import android.content.Context; import android.support.annotation.NonNull; -import com.blogspot.e_kanivets.moneytracker.controller.ExportController; +import com.blogspot.e_kanivets.moneytracker.controller.external.ExportController; import com.blogspot.e_kanivets.moneytracker.controller.FormatController; import com.blogspot.e_kanivets.moneytracker.controller.PeriodController; import com.blogspot.e_kanivets.moneytracker.controller.data.AccountController; @@ -13,6 +13,7 @@ import com.blogspot.e_kanivets.moneytracker.controller.PreferenceController; import com.blogspot.e_kanivets.moneytracker.controller.data.RecordController; import com.blogspot.e_kanivets.moneytracker.controller.data.TransferController; +import com.blogspot.e_kanivets.moneytracker.controller.external.ImportController; import com.blogspot.e_kanivets.moneytracker.entity.data.Account; import com.blogspot.e_kanivets.moneytracker.entity.data.Category; import com.blogspot.e_kanivets.moneytracker.entity.data.ExchangeRate; @@ -114,4 +115,11 @@ public ExportController providesExportController(RecordController recordControll CategoryController categoryController) { return new ExportController(recordController, categoryController); } + + @Provides + @NonNull + @Singleton + public ImportController providesImportController(RecordController recordController) { + return new ImportController(recordController); + } } diff --git a/app/src/main/res/drawable-xxxhdpi/ic_import.png b/app/src/main/res/drawable-xxxhdpi/ic_import.png new file mode 100755 index 0000000000000000000000000000000000000000..de9501ec10397f7488eab207d8194a0050f438de GIT binary patch literal 802 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE(}8pX7+2iB`GtXjX|1P=V@SoVw|6%Bi3EzYe|*n(EN#O_#-6=m zVs=cIeh7$VC9aHgdKthZy!Dd6W9AP4s=DEblq*+rjq+_q|)h=B4M%G~V*>}sQ>|@M6<}7(TNurHC_qN>A7?o=FkkGGFUYpl6Y@Kpx z^PTP#c8Ru!6ThnPr2fC5`_cMA-&YZy)b)Se8pR7=@6mtv{=NAA>k^l*UAtCrb8EcI zmGiIjG#U(94VEz+6FD%0Ng|jbc``rHs<`O=ZL3XwGH5PUD{48(-f%-OhNWSL;HLj# zCeQ9yO%u$xU6#J)edX0VZyJm*mNo5W5YTQq%^;xObelmyx#=~-1N)}m3=gcGIv5_9 zA3F8BLG-`yT#^3ooQY)zB=fBmV;DY&DyA@e5LV1#XjrvM?Y~dZ4WM0f_wL<$>{sa; zA)|)r51kJ%%xmKp-@(73ZrkVjcg}lw<(b|x^dD|lVBEte&&2YZ-zzWTm6v(j&~cbuopBMLybMbRP=|oRrw<1m8(zSC z%a!26*rVC7QRq4A-$!$bi*0P9t4?lB*WAcl7v+C2;M=Xu%uA;112Vljx2Chd`2A0K z!v?vw#-l}VBR4T`$*nfwIo$ZwB4>%OAfYQj(I=e=FAQ=g!>Q`bfzV Qn1UHRUHx3vIVCg!0EmEK-2eap literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_import.xml b/app/src/main/res/layout/activity_import.xml new file mode 100644 index 0000000..40dbb19 --- /dev/null +++ b/app/src/main/res/layout/activity_import.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + +