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..4f250fc
--- /dev/null
+++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AboutActivity.java
@@ -0,0 +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/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/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/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/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/controller/PreferenceController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/PreferenceController.java
index a3130f3..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
@@ -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,19 @@ public String readDropboxAccessToken() {
return getDefaultPrefs().getString(KEY_DROPBOX_ACCESS_TOKEN, null);
}
+ @NonNull
+ public Set readFilteredCategories() {
+ // 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
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/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 extends List extends Map>> getChildData() {
List