Skip to content
This repository was archived by the owner on Jun 27, 2020. It is now read-only.
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@
android:screenOrientation="portrait"
android:theme="@style/Theme.Default" />
<activity
android:name=".activity.ExportActivity"
android:name=".activity.external.ExportActivity"
android:label="@string/title_export"
android:screenOrientation="portrait"
android:theme="@style/Theme.Default" />
Expand All @@ -73,6 +73,11 @@
android:label="@string/title_charts"
android:screenOrientation="portrait"
android:theme="@style/Theme.Default" />
<activity
android:name=".activity.external.ImportActivity"
android:label="@string/title_import"
android:screenOrientation="portrait"
android:theme="@style/Theme.Default" />

<provider
android:name="android.support.v4.content.FileProvider"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@

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.external.ExportActivity;
import com.blogspot.e_kanivets.moneytracker.activity.external.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;
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -117,6 +124,10 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
update();
break;

case REQUEST_IMPORT:
update();
break;

default:
break;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.blogspot.e_kanivets.moneytracker.activity;
package com.blogspot.e_kanivets.moneytracker.activity.external;

import android.content.Intent;
import android.net.Uri;
Expand All @@ -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.external.ExportController;

import java.io.File;
import java.io.FileNotFoundException;
Expand All @@ -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() {
Expand All @@ -42,7 +42,7 @@ protected boolean initData() {

@OnClick(R.id.btn_export)
public void exportRecords() {
List<String> records = recordController.getRecordsForExport(0, Long.MAX_VALUE);
List<String> records = exportController.getRecordsForExport(0, Long.MAX_VALUE);

File exportDir = new File(getCacheDir(), "export");
boolean exportDirCreated = exportDir.mkdirs();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package com.blogspot.e_kanivets.moneytracker.activity.external;

import android.support.v7.app.AlertDialog;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;

import com.blogspot.e_kanivets.moneytracker.R;
import com.blogspot.e_kanivets.moneytracker.activity.base.BaseBackActivity;
import com.blogspot.e_kanivets.moneytracker.controller.external.ImportController;
import com.blogspot.e_kanivets.moneytracker.entity.data.Record;

import java.util.List;

import javax.inject.Inject;

import butterknife.Bind;
import butterknife.OnClick;

public class ImportActivity extends BaseBackActivity {
@Inject
ImportController importController;

@Bind(R.id.et_import_data)
EditText etImportData;

@Override
protected int getContentViewId() {
return R.layout.activity_import;
}

@Override
protected boolean initData() {
boolean result = super.initData();
getAppComponent().inject(ImportActivity.this);
return result;
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_import, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_help:
AlertDialog.Builder builder = new AlertDialog.Builder(ImportActivity.this);
builder.setTitle(R.string.help)
.setMessage(R.string.import_help)
.setPositiveButton(android.R.string.ok, null)
.show();
return true;

default:
return super.onOptionsItemSelected(item);
}
}

@OnClick(R.id.btn_import)
public void importRecords() {
String data = etImportData.getText().toString().trim();
List<Record> recordList = importController.importRecordsFromCsv(data);
showToast(getString(R.string.records_imported, recordList.size()));

setResult(RESULT_OK);
finish();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/**
Expand Down Expand Up @@ -90,6 +92,14 @@ public List<Record> readAll() {
public List<Record> readWithCondition(String condition, String[] args) {
List<Record> recordList = super.readWithCondition(condition, args);

// Sort record list by time field from smallest to biggest
Collections.sort(recordList, new Comparator<Record>() {
@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<Record> completedRecordList = new ArrayList<>();
for (Record record : recordList) {
Expand Down Expand Up @@ -117,45 +127,6 @@ public List<Record> getRecordsForPeriod(Period period) {
return readWithCondition(condition, args);
}

public List<String> getRecordsForExport(long fromDate, long toDate) {
final String DELIMITER = ";";
List<String> 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<Record> 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;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
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;
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 final RecordController recordController;
private final CategoryController categoryController;

public ExportController(RecordController recordController, CategoryController categoryController) {
this.recordController = recordController;
this.categoryController = categoryController;
}

public List<String> getRecordsForExport(long fromDate, long toDate) {
List<String> result = new ArrayList<>();

/* First of all add a header */
@SuppressWarnings("StringBufferReplaceableByString")
StringBuilder sb = new StringBuilder();
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());

String condition = DbHelper.TIME_COLUMN + " BETWEEN ? AND ?";
String[] args = new String[]{Long.toString(fromDate), Long.toString(toDate)};

List<Record> recordList = recordController.readWithCondition(condition, args);

for (Record record : recordList) {
sb = new StringBuilder();
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(Head.DELIMITER);
sb.append(record.getType() == 0 ? record.getFullPrice()
: -record.getFullPrice()).append(Head.DELIMITER);
sb.append(record.getCurrency() == null ? DbHelper.DEFAULT_ACCOUNT_CURRENCY
: record.getCurrency());

result.add(sb.toString());
}

return result;
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
Loading