From c56fb1f6d6f880cbce55f1915ba60e3aed04568c Mon Sep 17 00:00:00 2001 From: Evgenii Kanivets Date: Mon, 15 Aug 2016 20:02:01 +0300 Subject: [PATCH 01/10] #100[30m]. Add UI and base logic. --- .../adapter/CategoryAutoCompleteAdapter.java | 44 +++++++++++++++++++ .../util/CategoryAutoCompleter.java | 9 ++++ app/src/main/res/drawable/ic_cancel.xml | 13 ++++++ .../main/res/layout/view_category_item.xml | 29 ++++++++++-- 4 files changed, 91 insertions(+), 4 deletions(-) create mode 100644 app/src/main/res/drawable/ic_cancel.xml diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/CategoryAutoCompleteAdapter.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/CategoryAutoCompleteAdapter.java index 22103b7..234c1bc 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/CategoryAutoCompleteAdapter.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/CategoryAutoCompleteAdapter.java @@ -1,15 +1,23 @@ package com.blogspot.e_kanivets.moneytracker.adapter; import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Filter; import android.widget.Filterable; +import android.widget.TextView; +import com.blogspot.e_kanivets.moneytracker.R; import com.blogspot.e_kanivets.moneytracker.util.CategoryAutoCompleter; import java.util.ArrayList; import java.util.List; +import butterknife.Bind; +import butterknife.ButterKnife; + /** * Custom adapter to autocomplete categories. * Created on 3/18/16. @@ -25,6 +33,31 @@ public CategoryAutoCompleteAdapter(Context context, int resource, CategoryAutoCo this.autoCompleter = autoCompleter; } + @Override + public View getView(int position, View convertView, ViewGroup parent) { + ViewHolder viewHolder; + + if (convertView == null) { + convertView = LayoutInflater.from(getContext()).inflate(R.layout.view_category_item, parent, false); + viewHolder = new ViewHolder(convertView); + convertView.setTag(viewHolder); + } else viewHolder = (ViewHolder) convertView.getTag(); + + final String category = resultList.get(position); + + viewHolder.tvCategory.setText(category); + viewHolder.ivCancel.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + autoCompleter.removeFromAutoComplete(category); + resultList.remove(category); + notifyDataSetChanged(); + } + }); + + return convertView; + } + @Override public int getCount() { return resultList.size(); @@ -63,4 +96,15 @@ protected void publishResults(CharSequence constraint, FilterResults results) { } }; } + + public static class ViewHolder { + @Bind(R.id.tv_category) + TextView tvCategory; + @Bind(R.id.iv_cancel) + View ivCancel; + + public ViewHolder(View view) { + ButterKnife.bind(this, view); + } + } } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/CategoryAutoCompleter.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/CategoryAutoCompleter.java index d1a7d87..bbe8562 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/CategoryAutoCompleter.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/CategoryAutoCompleter.java @@ -4,7 +4,9 @@ import com.blogspot.e_kanivets.moneytracker.entity.data.Category; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; /** * Util class to encapsulate category autocomplete logic. @@ -14,9 +16,11 @@ */ public class CategoryAutoCompleter { private List categoryList; + private Set filterSet; public CategoryAutoCompleter(CategoryController categoryController) { categoryList = new ArrayList<>(); + filterSet = new HashSet<>(); for (Category category : categoryController.readAll()) { categoryList.add(category.getName()); @@ -32,4 +36,9 @@ public List completeByPart(String part) { return resultList; } + + public void removeFromAutoComplete(String category) { + filterSet.add(category); + categoryList.remove(category); + } } diff --git a/app/src/main/res/drawable/ic_cancel.xml b/app/src/main/res/drawable/ic_cancel.xml new file mode 100644 index 0000000..e247f84 --- /dev/null +++ b/app/src/main/res/drawable/ic_cancel.xml @@ -0,0 +1,13 @@ + + + diff --git a/app/src/main/res/layout/view_category_item.xml b/app/src/main/res/layout/view_category_item.xml index 88e399c..cb6c6b2 100644 --- a/app/src/main/res/layout/view_category_item.xml +++ b/app/src/main/res/layout/view_category_item.xml @@ -1,7 +1,28 @@ - \ No newline at end of file + android:gravity="center_vertical" + android:orientation="horizontal" + android:paddingEnd="@dimen/half_margin" + android:paddingStart="@dimen/normal_margin" + tools:ignore="UseCompoundDrawables"> + + + + + + From e5b5aac21c764a3be3c2c587543200eee835e48d Mon Sep 17 00:00:00 2001 From: Evgenii Kanivets Date: Tue, 16 Aug 2016 11:57:51 +0300 Subject: [PATCH 02/10] #100[30m]. Remove categories from autocomplete. --- .../controller/PreferenceController.java | 38 +++++++++++----- .../controller/data/CategoryController.java | 44 ++++++++++++++++++- .../di/module/ControllerModule.java | 5 ++- .../util/CategoryAutoCompleter.java | 10 ++--- 4 files changed, 75 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/PreferenceController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/PreferenceController.java index a3130f3..266866b 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/PreferenceController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/PreferenceController.java @@ -8,6 +8,9 @@ import com.blogspot.e_kanivets.moneytracker.R; +import java.util.HashSet; +import java.util.Set; + /** * Controller class to encapsulate Shared Preferences handling logic. * Not deal with {@link com.blogspot.e_kanivets.moneytracker.repo.base.IRepo} instances as others. @@ -22,6 +25,7 @@ public class PreferenceController { private static final String KEY_LAST_TS = "key_last_ts"; private static final String KEY_PERIOD_TYPE = "key_period_type"; private static final String KEY_DROPBOX_ACCESS_TOKEN = "key_dropbox_access_token"; + private static final String KEY_FILTERED_CATEGORIES = "key_filtered_categories"; private static final int RATE_PERIOD = 5; @@ -34,7 +38,7 @@ public PreferenceController(@NonNull Context context) { public void addLaunchCount() { SharedPreferences preferences = getDefaultPrefs(); - SharedPreferences.Editor editor = preferences.edit(); + SharedPreferences.Editor editor = getEditor(); editor.putInt(LAUNCH_COUNT, preferences.getInt(LAUNCH_COUNT, 0) + 1); editor.apply(); } @@ -50,16 +54,13 @@ public boolean checkRateDialog() { } public void appRated() { - SharedPreferences preferences = getDefaultPrefs(); - SharedPreferences.Editor editor = preferences.edit(); + SharedPreferences.Editor editor = getEditor(); editor.putBoolean(APP_RATED, true); editor.apply(); } public void writeFirstTs(long firstTs) { - SharedPreferences preferences = getDefaultPrefs(); - SharedPreferences.Editor editor = preferences.edit(); - + SharedPreferences.Editor editor = getEditor(); editor.putLong(KEY_FIRST_TS, firstTs); editor.apply(); } @@ -73,21 +74,23 @@ public void writeLastTs(long lastTs) { } public void writePeriodType(String periodType) { - SharedPreferences preferences = getDefaultPrefs(); - SharedPreferences.Editor editor = preferences.edit(); - + SharedPreferences.Editor editor = getEditor(); editor.putString(KEY_PERIOD_TYPE, periodType); editor.apply(); } public void writeDropboxAccessToken(String accessToken) { - SharedPreferences preferences = getDefaultPrefs(); - SharedPreferences.Editor editor = preferences.edit(); - + SharedPreferences.Editor editor = getEditor(); editor.putString(KEY_DROPBOX_ACCESS_TOKEN, accessToken); editor.apply(); } + public void writeFilteredCategories(@Nullable Set categorySet) { + SharedPreferences.Editor editor = getEditor(); + editor.putStringSet(KEY_FILTERED_CATEGORIES, categorySet); + editor.apply(); + } + public long readDefaultAccountId() { String defaultAccountPref = context.getString(R.string.pref_default_account); SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); @@ -129,7 +132,18 @@ public String readDropboxAccessToken() { return getDefaultPrefs().getString(KEY_DROPBOX_ACCESS_TOKEN, null); } + @NonNull + public Set readFilteredCategories() { + return getDefaultPrefs().getStringSet(KEY_FILTERED_CATEGORIES, new HashSet()); + } + + @NonNull private SharedPreferences getDefaultPrefs() { return context.getSharedPreferences(context.getPackageName(), Context.MODE_PRIVATE); } + + @NonNull + private SharedPreferences.Editor getEditor() { + return getDefaultPrefs().edit(); + } } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/CategoryController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/CategoryController.java index e95ed12..dd8bbca 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/CategoryController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/data/CategoryController.java @@ -3,12 +3,15 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import com.blogspot.e_kanivets.moneytracker.controller.PreferenceController; import com.blogspot.e_kanivets.moneytracker.repo.DbHelper; import com.blogspot.e_kanivets.moneytracker.controller.base.BaseController; import com.blogspot.e_kanivets.moneytracker.entity.data.Category; import com.blogspot.e_kanivets.moneytracker.repo.base.IRepo; +import java.util.ArrayList; import java.util.List; +import java.util.Set; /** * Controller class to encapsulate category handling logic. @@ -20,13 +23,23 @@ public class CategoryController extends BaseController { @SuppressWarnings("unused") private static final String TAG = "CategoryController"; - public CategoryController(@NonNull IRepo categoryRepo) { + @NonNull + private final PreferenceController preferenceController; + @NonNull + private Set filteredCategories; + + public CategoryController(@NonNull IRepo categoryRepo, + @NonNull PreferenceController preferenceController) { super(categoryRepo); + this.preferenceController = preferenceController; + filteredCategories = preferenceController.readFilteredCategories(); } public Category readOrCreate(@Nullable String categoryName) { if (categoryName == null || categoryName.trim().isEmpty()) return null; + enableCategory(categoryName); + String condition = DbHelper.NAME_COLUMN + "=?"; String[] args = {categoryName}; List categoryList = repo.readWithCondition(condition, args); @@ -34,4 +47,31 @@ public Category readOrCreate(@Nullable String categoryName) { if (categoryList.size() >= 1) return categoryList.get(0); else return repo.create(new Category(categoryName)); } -} \ No newline at end of file + + @NonNull + public List readFiltered() { + List filteredList = new ArrayList<>(); + + for (Category category : readAll()) { + if (!filteredCategories.contains(category.getName())) filteredList.add(category); + } + + return filteredList; + } + + /** + * @param category to disable when request filtered list. + */ + public void disableCategory(@Nullable String category) { + filteredCategories.add(category); + preferenceController.writeFilteredCategories(filteredCategories); + } + + /** + * @param category to enable when request filtered list. + */ + public void enableCategory(@Nullable String category) { + filteredCategories.remove(category); + preferenceController.writeFilteredCategories(filteredCategories); + } +} 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 d54f1be..af86465 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 @@ -52,8 +52,9 @@ public AccountController providesAccountController(IRepo accountRepo, @Provides @NonNull @Singleton - public CategoryController providesCategoryController(IRepo categoryRepo) { - return new CategoryController(categoryRepo); + public CategoryController providesCategoryController(IRepo categoryRepo, + PreferenceController preferenceController) { + return new CategoryController(categoryRepo, preferenceController); } @Provides diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/CategoryAutoCompleter.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/CategoryAutoCompleter.java index bbe8562..86ea779 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/CategoryAutoCompleter.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/CategoryAutoCompleter.java @@ -4,9 +4,7 @@ import com.blogspot.e_kanivets.moneytracker.entity.data.Category; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; -import java.util.Set; /** * Util class to encapsulate category autocomplete logic. @@ -16,13 +14,13 @@ */ public class CategoryAutoCompleter { private List categoryList; - private Set filterSet; + private CategoryController categoryController; public CategoryAutoCompleter(CategoryController categoryController) { + this.categoryController = categoryController; categoryList = new ArrayList<>(); - filterSet = new HashSet<>(); - for (Category category : categoryController.readAll()) { + for (Category category : categoryController.readFiltered()) { categoryList.add(category.getName()); } } @@ -38,7 +36,7 @@ public List completeByPart(String part) { } public void removeFromAutoComplete(String category) { - filterSet.add(category); categoryList.remove(category); + categoryController.disableCategory(category); } } From 0ce09d6da0c7562d6ef6ead6bd1c2b69f1486878 Mon Sep 17 00:00:00 2001 From: Evgenii Kanivets Date: Tue, 16 Aug 2016 12:38:53 +0300 Subject: [PATCH 03/10] Fix unit test. --- .../controller/data/CategoryControllerTest.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/CategoryControllerTest.java b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/CategoryControllerTest.java index 057d1bd..c961f01 100644 --- a/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/CategoryControllerTest.java +++ b/app/src/test/java/com/blogspot/e_kanivets/moneytracker/controller/data/CategoryControllerTest.java @@ -3,10 +3,13 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import com.blogspot.e_kanivets.moneytracker.controller.PreferenceController; import com.blogspot.e_kanivets.moneytracker.entity.data.Category; import com.blogspot.e_kanivets.moneytracker.repo.base.IRepo; +import org.junit.Before; import org.junit.Test; +import org.mockito.Mockito; import java.util.ArrayList; import java.util.List; @@ -20,10 +23,16 @@ * @author Evgenii Kanivets */ public class CategoryControllerTest { + private PreferenceController mockPrefs; + + @Before + public void setUp() throws Exception { + mockPrefs = Mockito.mock(PreferenceController.class); + } @Test public void testReadOrCreate() throws Exception { - CategoryController categoryController = new CategoryController(emptyRepo); + CategoryController categoryController = new CategoryController(emptyRepo, mockPrefs); assertNull(categoryController.readOrCreate(null)); assertNull(categoryController.readOrCreate("")); @@ -34,7 +43,7 @@ public void testReadOrCreate() throws Exception { result = categoryController.readOrCreate("category 1"); assertEquals("category 1", result.getName()); - categoryController = new CategoryController(repo); + categoryController = new CategoryController(repo, mockPrefs); result = categoryController.readOrCreate("category 1"); assertEquals("category 1", result.getName()); From 633514a4755c968e60bb95f622a9b51afd60418c Mon Sep 17 00:00:00 2001 From: Evgenii Kanivets Date: Wed, 17 Aug 2016 15:38:57 +0300 Subject: [PATCH 04/10] #114[30m]. Display 'Edit' title when editing record. --- .../moneytracker/activity/record/AddRecordActivity.java | 6 ++++-- 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 +++ 4 files changed, 13 insertions(+), 2 deletions(-) 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 21a3713..0267658 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 @@ -132,7 +132,8 @@ protected void initViews() { if (getSupportActionBar() != null) { switch (type) { case Record.TYPE_EXPENSE: - getSupportActionBar().setTitle(R.string.title_add_expense); + if (mode == Mode.MODE_ADD) getSupportActionBar().setTitle(R.string.title_add_expense); + else getSupportActionBar().setTitle(R.string.title_edit_expense); getSupportActionBar().setBackgroundDrawable( new ColorDrawable(getResources().getColor(R.color.red_light))); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { @@ -144,7 +145,8 @@ protected void initViews() { break; case Record.TYPE_INCOME: - getSupportActionBar().setTitle(R.string.title_add_income); + if (mode == Mode.MODE_ADD) getSupportActionBar().setTitle(R.string.title_add_income); + else getSupportActionBar().setTitle(R.string.title_edit_income); getSupportActionBar().setBackgroundDrawable( new ColorDrawable(getResources().getColor(R.color.green_light))); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index cc21d49..7f35a7b 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -93,4 +93,7 @@ Предупреждение Вы действительно хотите удалить все текущие данные и восстановить бэкап %1$s? Пожалуйста, сделайте бэкап текущих данных. Сделать бэкап + + Редактировать доход + Редактировать расход diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 85be812..8378506 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -93,4 +93,7 @@ Попередження Ви дійсно хочете видалити усі поточні дані і відновити бекап %1$s? Будь ласка, зробіть бекап поточних даних. Зробити бекап + + Редагувати дохід + Редагувати витрату diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6b6b9be..1a68876 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -101,5 +101,8 @@ Warning Do you really want to erase all current data and restore backup file %1$s? Be sure to backup current data. Backup now + + Edit income + Edit expense From c8353ba5a8372bb1d2b761ef58c8d31be2666a55 Mon Sep 17 00:00:00 2001 From: Evgenii Kanivets Date: Wed, 17 Aug 2016 16:02:06 +0300 Subject: [PATCH 05/10] #116[30m]. Show loading messages. --- .../moneytracker/activity/base/BaseActivity.java | 14 ++++++++------ .../activity/external/BackupActivity.java | 6 +++--- .../activity/external/ImportExportActivity.java | 2 +- app/src/main/res/values-ru/strings.xml | 5 +++++ app/src/main/res/values-uk/strings.xml | 5 +++++ app/src/main/res/values/strings.xml | 5 +++++ 6 files changed, 27 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseActivity.java index ce00ecf..208e505 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/BaseActivity.java @@ -68,14 +68,16 @@ protected void showToast(@StringRes int messageId) { Toast.makeText(BaseActivity.this, messageId, Toast.LENGTH_SHORT).show(); } - public void startProgress() { - if (getProgressBar() == null) return; - getProgressBar().show(); + public void startProgress(@Nullable String message) { + ProgressDialog progressDialog = getProgressDialog(); + if (progressDialog == null) return; + if (message != null) progressDialog.setMessage(message); + progressDialog.show(); } public void stopProgress() { - if (getProgressBar() == null) return; - getProgressBar().dismiss(); + if (getProgressDialog() == null) return; + getProgressDialog().dismiss(); } public void showAlert(@Nullable String title, @Nullable String message) { @@ -90,7 +92,7 @@ public void showAlert(@Nullable String title, @Nullable String message) { dialog.show(); } - private ProgressDialog getProgressBar() { + private ProgressDialog getProgressDialog() { if (progressDialog == null) progressDialog = new ProgressDialog(this); return progressDialog; } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/external/BackupActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/external/BackupActivity.java index 5a44458..71250ba 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/external/BackupActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/external/BackupActivity.java @@ -89,7 +89,7 @@ protected void onResume() { @OnClick(R.id.btn_backup_now) public void backupNow() { - startProgress(); + startProgress(getString(R.string.making_backup)); backupController.makeBackup(dbApi, new BackupController.OnBackupListener() { @Override public void onBackupSuccess() { @@ -131,7 +131,7 @@ public void onClick(DialogInterface dialog, int which) { } private void restoreBackup(final String backupName) { - startProgress(); + startProgress(getString(R.string.restoring_backup)); backupController.restoreBackup(dbApi, backupName, new BackupController.OnRestoreBackupListener() { @Override public void onRestoreSuccess() { @@ -170,7 +170,7 @@ public void onRestoreFailure(String reason) { } private void fetchBackups() { - startProgress(); + startProgress(getString(R.string.fetching_backups)); backupController.fetchBackups(dbApi, new BackupController.OnFetchBackupListListener() { @Override public void onBackupsFetched(@NonNull List backupList) { diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/external/ImportExportActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/external/ImportExportActivity.java index 4026285..2d4dba4 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/external/ImportExportActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/external/ImportExportActivity.java @@ -80,7 +80,7 @@ public void importRecords() { @Override protected void onPreExecute() { super.onPreExecute(); - startProgress(); + startProgress(getString(R.string.importing_records)); } @Override diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 7f35a7b..abf7518 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -96,4 +96,9 @@ Редактировать доход Редактировать расход + + Импортирование записей… + Создание бэкапа… + Восстановление бэкапа… + Загрузка бэкапов… diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 8378506..0c242b8 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -96,4 +96,9 @@ Редагувати дохід Редагувати витрату + + Імпорт записів… + Створення бекапу… + Відновлення бекапу… + Завантаження бекапів… diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1a68876..2ed53e3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -104,5 +104,10 @@ Edit income Edit expense + + Importing records… + Making backup… + Restoring backup… + Fetching backups… From 630553692b0cfdd02c76c0a0830693f9120a3018 Mon Sep 17 00:00:00 2001 From: Evgenii Kanivets Date: Wed, 17 Aug 2016 19:15:31 +0300 Subject: [PATCH 06/10] #112[30m]. Display number of records in Summary records on Report screen. --- .../report/record/RecordReportConverter.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/RecordReportConverter.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/RecordReportConverter.java index 07ad91a..3f302f7 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/RecordReportConverter.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/record/RecordReportConverter.java @@ -65,7 +65,7 @@ public List>> getChildData() { List> childDataItem = new ArrayList<>(); for (SummaryRecord summaryRecord : categoryRecord.getSummaryRecordList()) { Map m = new HashMap<>(); - m.put(TITLE_PARAM_NAME, summaryRecord.getTitle()); + m.put(TITLE_PARAM_NAME, getTitle(summaryRecord)); m.put(PRICE_PARAM_NAME, Double.toString(summaryRecord.getAmount())); childDataItem.add(m); @@ -91,4 +91,10 @@ public String[] getChildFrom() { public int[] getChildTo() { return new int[]{R.id.tv_category, R.id.tv_total}; } -} \ No newline at end of file + + private String getTitle(@NonNull SummaryRecord record) { + int count = record.getRecordList().size(); + if (count <= 1) return record.getTitle(); + else return record.getTitle() + " (" + count + ")"; + } +} From 6620e51eb32966dbd212d7fd969ee4e1316088b8 Mon Sep 17 00:00:00 2001 From: Evgenii Kanivets Date: Thu, 18 Aug 2016 19:08:12 +0300 Subject: [PATCH 07/10] #107[1h]. Add about link and empty screen. --- app/src/main/AndroidManifest.xml | 7 ++++++ .../moneytracker/activity/AboutActivity.java | 12 ++++++++++ .../activity/SettingsActivity.java | 9 +++++++ app/src/main/res/layout/activity_about.xml | 24 +++++++++++++++++++ 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 | 4 ++++ app/src/main/res/xml/preferences.xml | 11 ++++++++- 8 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AboutActivity.java create mode 100644 app/src/main/res/layout/activity_about.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 151b6ab..0b5070f 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -81,6 +81,12 @@ android:label="@string/backup_data" android:screenOrientation="portrait" android:theme="@style/Theme.Default" /> + + + diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AboutActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AboutActivity.java new file mode 100644 index 0000000..d15b60e --- /dev/null +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AboutActivity.java @@ -0,0 +1,12 @@ +package com.blogspot.e_kanivets.moneytracker.activity; + +import com.blogspot.e_kanivets.moneytracker.R; +import com.blogspot.e_kanivets.moneytracker.activity.base.BaseBackActivity; + +public class AboutActivity extends BaseBackActivity { + + @Override + protected int getContentViewId() { + return R.layout.activity_about; + } +} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/SettingsActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/SettingsActivity.java index 7316a13..294e218 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/SettingsActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/SettingsActivity.java @@ -1,10 +1,12 @@ package com.blogspot.e_kanivets.moneytracker.activity; +import android.os.Build; import android.os.Bundle; import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceFragment; +import com.blogspot.e_kanivets.moneytracker.BuildConfig; import com.blogspot.e_kanivets.moneytracker.MtApp; import com.blogspot.e_kanivets.moneytracker.R; import com.blogspot.e_kanivets.moneytracker.activity.base.BaseBackActivity; @@ -58,6 +60,13 @@ public void onCreate(Bundle savedInstanceState) { setupDefaultAccountPref(); setupDefaultCurrencyPref(); setupDisplayPrecision(); + setupAboutPref(); + } + + private void setupAboutPref() { + Preference preference = findPreference(getString(R.string.pref_about)); + preference.setSummary(getString(R.string.about_summary, BuildConfig.VERSION_NAME, + Build.VERSION.RELEASE)); } private void setupDefaultAccountPref() { diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml new file mode 100644 index 0000000..e0b7768 --- /dev/null +++ b/app/src/main/res/layout/activity_about.xml @@ -0,0 +1,24 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index abf7518..0f8c140 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -101,4 +101,7 @@ Создание бэкапа… Восстановление бэкапа… Загрузка бэкапов… + + Версия %1$s (Android %2$s) + О приложении diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 0c242b8..b3637d7 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -101,4 +101,7 @@ Створення бекапу… Відновлення бекапу… Завантаження бекапів… + + Версія %1$s (Android %2$s) + Про додаток diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2ed53e3..a8b136a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -109,5 +109,9 @@ Making backup… Restoring backup… Fetching backups… + + pref_about + Version %1$s (Android %2$s) + About diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 1f68ed7..041c89a 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -14,4 +14,13 @@ android:key="@string/pref_display_precision" android:summary="%s" android:title="@string/display_precision" /> - \ No newline at end of file + + + + + From af4bf428b00bf714c70ffc28872d4f82995e2f6a Mon Sep 17 00:00:00 2001 From: Evgenii Kanivets Date: Wed, 24 Aug 2016 11:38:25 +0300 Subject: [PATCH 08/10] #100[30m]. Fix a bug with SharedPrefernces. --- .../moneytracker/controller/PreferenceController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/PreferenceController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/PreferenceController.java index 266866b..682f788 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/PreferenceController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/PreferenceController.java @@ -134,7 +134,8 @@ public String readDropboxAccessToken() { @NonNull public Set readFilteredCategories() { - return getDefaultPrefs().getStringSet(KEY_FILTERED_CATEGORIES, new HashSet()); + // http://stackoverflow.com/questions/14034803/misbehavior-when-trying-to-store-a-string-set-using-sharedpreferences/14034804#14034804 + return new HashSet<>(getDefaultPrefs().getStringSet(KEY_FILTERED_CATEGORIES, new HashSet())); } @NonNull From a4602a80a7559c05acc97359db9244d92cf64e4b Mon Sep 17 00:00:00 2001 From: Evgenii Kanivets Date: Wed, 24 Aug 2016 13:01:41 +0300 Subject: [PATCH 09/10] #107[1h]. Add about text. --- .../moneytracker/activity/AboutActivity.java | 13 ++++++++++++ app/src/main/res/layout/activity_about.xml | 20 +++++++++++++++++++ app/src/main/res/values/strings.xml | 1 + 3 files changed, 34 insertions(+) diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AboutActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AboutActivity.java index d15b60e..4f250fc 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AboutActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AboutActivity.java @@ -1,12 +1,25 @@ package com.blogspot.e_kanivets.moneytracker.activity; +import android.text.method.LinkMovementMethod; +import android.widget.TextView; + import com.blogspot.e_kanivets.moneytracker.R; import com.blogspot.e_kanivets.moneytracker.activity.base.BaseBackActivity; +import butterknife.Bind; + public class AboutActivity extends BaseBackActivity { + @Bind(R.id.tv_about) + TextView tvAbout; @Override protected int getContentViewId() { return R.layout.activity_about; } + + @Override + protected void initViews() { + super.initViews(); + tvAbout.setMovementMethod(LinkMovementMethod.getInstance()); + } } diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml index e0b7768..0984b68 100644 --- a/app/src/main/res/layout/activity_about.xml +++ b/app/src/main/res/layout/activity_about.xml @@ -21,4 +21,24 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a8b136a..943f9b3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -114,4 +114,5 @@ Version %1$s (Android %2$s) About + Open Money Tracker (OMT) is an accounting application. You can manage your incomes and expenses in easy way. Accounts and currency exchange rates are also available.\n\nTo help us make OMT better, please report bugs to the 4PDA forum; new feature ideas are very welcome too. Find answers or start a discussion on forum.\n\nOMT is open source software, so everyone is encouraged to become a contributor. Non-developers can also help. For instance, you can help translate OMT, provide screenshots or blog about OMT.\n\nOMT is released under the GNU-GPL v3 license and source code is available on GitHub. From eaa8f7a5a584eb41c343f3b8db4aa914357bccc5 Mon Sep 17 00:00:00 2001 From: Evgenii Kanivets Date: Wed, 24 Aug 2016 13:34:47 +0300 Subject: [PATCH 10/10] #107[1h]. Translate about. --- app/src/main/res/values-ru/strings.xml | 1 + app/src/main/res/values-uk/strings.xml | 1 + app/src/main/res/values/strings.xml | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 0f8c140..1a74995 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -104,4 +104,5 @@ Версия %1$s (Android %2$s) О приложении + Open Money Tracker (OMT) это приложения для ведения личных финансов. Вы легко можете управлять доходами и расходами. Также доступны счета и курсы обмена.\n\nДля того чтобы помочь сделать OMT лучше, пишите о багах на форуме 4PDA; идеи новых функций также приветствуются. Ищите ответы или начинайте обсуждение на форуме.\n\nOMT это проект с открытым исходным кодом, так что каждый может помочь с его разработкой. Не-разработчики также могут помочь. Например, вы можете помочь с переводом, предоставить скриншоты или написать статью в блоге о OMT.\n\nOMT выпущен под GNU-GPL v3 лицензией и исходный код доступен на GitHub.\n\nПрофиль разработчика на LinkedIn. diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index b3637d7..430d366 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -104,4 +104,5 @@ Версія %1$s (Android %2$s) Про додаток + Open Money Tracker (OMT) це додаток для обліку персональних фінансів. Ви можете з легкістю керувати доходами та витратами. Також доступні рахунки та курси обміну.\n\nДля того щоб допомогти нам зробити OMT краще, пишіть про баги на форумі 4PDA; ідеї нових функцій також підтримуються. Знайдіть відповіді або розпочніть бесіду на форумі.\n\nOMT це додаток з відкритим сирцевим кодом, тож будь-хто може стати учасником. Не-розробники також можуть допомогти. Наприклад, Ви можете допомогти з перекладом OMT, надати знімки екранів або написати у блозі про OMT.\n\nOMT випущено під GNU-GPL v3 ліцензією і сирцевий код доступний на GitHub.\n\nПрофiль розробника на LinkedIn. diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 943f9b3..ced045d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -113,6 +113,6 @@ pref_about Version %1$s (Android %2$s) About + Open Money Tracker (OMT) is an accounting application. You can manage your incomes and expenses in easy way. Accounts and currency exchange rates are also available.\n\nTo help us make OMT better, please report bugs to the 4PDA forum; new feature ideas are very welcome too. Find answers or start a discussion on forum.\n\nOMT is open source software, so everyone is encouraged to become a contributor. Non-developers can also help. For instance, you can help translate OMT, provide screenshots or blog about OMT.\n\nOMT is released under the GNU-GPL v3 license and source code is available on GitHub.\n\nDeveloper profile on LinkedIn. - Open Money Tracker (OMT) is an accounting application. You can manage your incomes and expenses in easy way. Accounts and currency exchange rates are also available.\n\nTo help us make OMT better, please report bugs to the 4PDA forum; new feature ideas are very welcome too. Find answers or start a discussion on forum.\n\nOMT is open source software, so everyone is encouraged to become a contributor. Non-developers can also help. For instance, you can help translate OMT, provide screenshots or blog about OMT.\n\nOMT is released under the GNU-GPL v3 license and source code is available on GitHub.