diff --git a/.travis.yml b/.travis.yml
index 0d30630..e8002e2 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,16 +1,17 @@
language: android
+jdk: oraclejdk8
android:
components:
# Uncomment the lines below if you want to
# use the latest revision of Android SDK Tools
- # - platform-tools
- # - tools
+ - platform-tools
+ - tools
# The BuildTools version used by your project
- - build-tools-22.0.1
+ - build-tools-25.0.2
# The SDK version used to compile your project
- - android-23
+ - android-25
# Additional components
- extra-google-google_play_services
diff --git a/app/build.gradle b/app/build.gradle
index ea38865..ed06c07 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -17,12 +17,12 @@ repositories {
apply plugin: 'com.neenbedankt.android-apt'
android {
- compileSdkVersion 23
- buildToolsVersion '21.1.2'
+ compileSdkVersion 25
+ buildToolsVersion '25.0.2'
defaultConfig {
applicationId 'com.blogspot.e_kanivets.moneytracker'
minSdkVersion 17
- targetSdkVersion 23
+ targetSdkVersion 25
versionCode 18
versionName '1.8.1'
}
@@ -62,24 +62,28 @@ apply plugin: 'com.getkeepsafe.dexcount'
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
- compile 'com.android.support:support-v4:23.2.1'
- compile 'com.android.support:appcompat-v7:23.2.1'
- compile 'com.android.support:design:23.2.1'
- compile 'com.jakewharton:butterknife:7.0.1' // View annotation bindings
- compile 'com.google.dagger:dagger:2.0.1' // Dependency injection tool
- compile 'com.github.PhilJay:MPAndroidChart:v2.2.4' // Charts
- compile 'com.jakewharton.timber:timber:4.1.2' // Advanced logging tool
+ // View annotation bindings
+ // Dependency injection tool
+ // Charts
+ // Advanced logging tool
- apt 'com.google.dagger:dagger-compiler:2.0.1'
- provided 'org.glassfish:javax.annotation:10.0-b28'
+ compile('com.crashlytics.sdk.android:crashlytics:2.6.5@aar') {
+ transitive = true;
+ }
+ compile 'com.android.support:support-v4:25.1.0'
+ compile 'com.android.support:appcompat-v7:25.1.0'
+ compile 'com.android.support:design:25.1.0'
+ compile 'com.jakewharton:butterknife:7.0.1'
+ compile 'com.google.dagger:dagger:2.0.1'
+ compile 'com.github.PhilJay:MPAndroidChart:v2.2.4'
+ compile 'com.jakewharton.timber:timber:4.1.2'
testCompile 'junit:junit:4.12'
testCompile 'org.mockito:mockito-core:2.0.43-beta'
androidTestCompile 'com.crittercism.dexmaker:dexmaker:1.4'
androidTestCompile 'com.crittercism.dexmaker:dexmaker-dx:1.4'
androidTestCompile 'com.crittercism.dexmaker:dexmaker-mockito:1.4'
- compile('com.crashlytics.sdk.android:crashlytics:2.6.5@aar') {
- transitive = true;
- }
+ apt 'com.google.dagger:dagger-compiler:2.0.1'
+ provided 'org.glassfish:javax.annotation:10.0-b28'
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 53269b3..5e3b6ca 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -67,7 +67,7 @@
android:screenOrientation="portrait"
android:theme="@style/Theme.Default" />
diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/MtApp.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/MtApp.java
index 86bcdd4..522cc61 100644
--- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/MtApp.java
+++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/MtApp.java
@@ -7,7 +7,9 @@
import com.blogspot.e_kanivets.moneytracker.di.module.ControllerModule;
import com.blogspot.e_kanivets.moneytracker.di.module.repo.CachedRepoModule;
+import com.blogspot.e_kanivets.moneytracker.util.AnswersProxy;
import com.crashlytics.android.Crashlytics;
+
import io.fabric.sdk.android.Fabric;
import timber.log.Timber;
@@ -29,15 +31,18 @@ public static MtApp get() {
@Override
public void onCreate() {
super.onCreate();
- if (!BuildConfig.DEBUG) {
- Fabric.with(this, new Crashlytics());
- }
mtApp = this;
buildAppComponent();
- if (BuildConfig.DEBUG) Timber.plant(new Timber.DebugTree());
- else Timber.plant(new ReleaseTree());
+ if (BuildConfig.DEBUG) {
+ Timber.plant(new Timber.DebugTree());
+ AnswersProxy.get().setEnabled(false);
+ } else {
+ Timber.plant(new ReleaseTree());
+ Fabric.with(this, new Crashlytics());
+ AnswersProxy.get().setEnabled(true);
+ }
}
public AppComponent getAppComponent() {
diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/ChartsActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/ChartsActivity.java
deleted file mode 100644
index 28ba5d2..0000000
--- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/ChartsActivity.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package com.blogspot.e_kanivets.moneytracker.activity;
-
-import com.blogspot.e_kanivets.moneytracker.R;
-import com.blogspot.e_kanivets.moneytracker.activity.base.BaseBackActivity;
-import com.blogspot.e_kanivets.moneytracker.controller.CurrencyController;
-import com.blogspot.e_kanivets.moneytracker.controller.data.ExchangeRateController;
-import com.blogspot.e_kanivets.moneytracker.controller.data.RecordController;
-import com.blogspot.e_kanivets.moneytracker.entity.data.Record;
-import com.blogspot.e_kanivets.moneytracker.report.ReportMaker;
-import com.blogspot.e_kanivets.moneytracker.report.chart.BarChartConverter;
-import com.blogspot.e_kanivets.moneytracker.report.chart.IMonthReport;
-import com.github.mikephil.charting.charts.BarChart;
-import com.github.mikephil.charting.data.BarData;
-
-import java.util.List;
-
-import javax.inject.Inject;
-
-import butterknife.Bind;
-
-public class ChartsActivity extends BaseBackActivity {
-
- @Inject
- RecordController recordController;
- @Inject
- ExchangeRateController exchangeRateController;
- @Inject
- CurrencyController currencyController;
-
- @Bind(R.id.bar_chart)
- BarChart barChart;
-
- @Override
- protected int getContentViewId() {
- return R.layout.activity_charts;
- }
-
- @Override
- protected boolean initData() {
- boolean result = super.initData();
- getAppComponent().inject(ChartsActivity.this);
- return result;
- }
-
- @Override
- protected void initViews() {
- super.initViews();
-
- ReportMaker reportMaker = new ReportMaker(exchangeRateController);
- String currency = currencyController.readDefaultCurrency();
- List recordList = recordController.readAll();
- List currencyNeeded = reportMaker.currencyNeeded(currency, recordList);
-
- IMonthReport monthReport = null;
- if (currencyNeeded.isEmpty()) monthReport = reportMaker.getMonthReport(currency, recordList);
- else barChart.setNoDataText(createRatesNeededList(currency, currencyNeeded));
-
- if (monthReport != null) {
- BarChartConverter barChartConverter = new BarChartConverter(ChartsActivity.this,
- monthReport);
-
- BarData barData = new BarData(barChartConverter.getXAxisValueList(),
- barChartConverter.getBarDataSetList());
- barData.setDrawValues(false);
-
- barChart.setData(barData);
- barChart.setDescription(null);
- barChart.setVisibleXRangeMinimum(8);
- barChart.setScaleYEnabled(false);
- barChart.setVisibleXRangeMaximum(34);
- barChart.setHighlightPerDragEnabled(false);
- barChart.setHighlightPerTapEnabled(false);
- }
- }
-
- protected String createRatesNeededList(String currency, List ratesNeeded) {
- StringBuilder sb = new StringBuilder(getString(R.string.error_exchange_rates));
-
- for (String str : ratesNeeded) {
- sb.append("\n").append(str).append(getString(R.string.arrow)).append(currency);
- }
-
- return sb.toString();
- }
-}
diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/AccountsActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/AccountsActivity.java
index 368f58f..15307a0 100644
--- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/AccountsActivity.java
+++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/AccountsActivity.java
@@ -14,8 +14,7 @@
import com.blogspot.e_kanivets.moneytracker.adapter.AccountAdapter;
import com.blogspot.e_kanivets.moneytracker.controller.data.AccountController;
import com.blogspot.e_kanivets.moneytracker.ui.presenter.AccountsSummaryPresenter;
-import com.crashlytics.android.answers.Answers;
-import com.crashlytics.android.answers.ContentViewEvent;
+import com.blogspot.e_kanivets.moneytracker.util.AnswersProxy;
import javax.inject.Inject;
@@ -101,22 +100,14 @@ public boolean onContextItemSelected(MenuItem item) {
}
public void makeTransfer() {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Add Transfer")
- .putContentType("Button"));
-
+ AnswersProxy.get().logButton("Add Transfer");
startActivityForResult(new Intent(AccountsActivity.this, TransferActivity.class),
REQUEST_TRANSFER);
}
@OnClick(R.id.btn_add_account)
public void addAccount() {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Add Account")
- .putContentType("Button"));
-
+ AnswersProxy.get().logButton("Add Account");
Intent intent = new Intent(AccountsActivity.this, AddAccountActivity.class);
startActivityForResult(intent, REQUEST_ADD_ACCOUNT);
}
diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/AddAccountActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/AddAccountActivity.java
index 9054e2e..8942c29 100644
--- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/AddAccountActivity.java
+++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/AddAccountActivity.java
@@ -11,10 +11,9 @@
import com.blogspot.e_kanivets.moneytracker.controller.data.AccountController;
import com.blogspot.e_kanivets.moneytracker.controller.CurrencyController;
import com.blogspot.e_kanivets.moneytracker.entity.data.Account;
+import com.blogspot.e_kanivets.moneytracker.util.AnswersProxy;
import com.blogspot.e_kanivets.moneytracker.util.validator.AccountValidator;
import com.blogspot.e_kanivets.moneytracker.util.validator.IValidator;
-import com.crashlytics.android.answers.Answers;
-import com.crashlytics.android.answers.ContentViewEvent;
import java.util.ArrayList;
@@ -79,17 +78,9 @@ public boolean onOptionsItemSelected(MenuItem item) {
}
private void tryAddAccount() {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Done Account")
- .putContentType("Button"));
-
+ AnswersProxy.get().logButton("Done Account");
if (addAccount()) {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Done Account")
- .putContentType("Event"));
-
+ AnswersProxy.get().logEvent("Done Account");
setResult(RESULT_OK);
finish();
}
diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/TransferActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/TransferActivity.java
index da8ca0c..373409a 100644
--- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/TransferActivity.java
+++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/account/TransferActivity.java
@@ -12,10 +12,9 @@
import com.blogspot.e_kanivets.moneytracker.controller.data.TransferController;
import com.blogspot.e_kanivets.moneytracker.entity.data.Account;
import com.blogspot.e_kanivets.moneytracker.entity.data.Transfer;
+import com.blogspot.e_kanivets.moneytracker.util.AnswersProxy;
import com.blogspot.e_kanivets.moneytracker.util.validator.IValidator;
import com.blogspot.e_kanivets.moneytracker.util.validator.TransferValidator;
-import com.crashlytics.android.answers.Answers;
-import com.crashlytics.android.answers.ContentViewEvent;
import java.util.ArrayList;
import java.util.List;
@@ -100,17 +99,9 @@ public boolean onOptionsItemSelected(MenuItem item) {
}
private void tryTransfer() {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Done Transfer")
- .putContentType("Button"));
-
+ AnswersProxy.get().logButton("Done Transfer");
if (doTransfer()) {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Done Transfer")
- .putContentType("Event"));
-
+ AnswersProxy.get().logEvent("Done Transfer");
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 0a61393..045cf04 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
@@ -1,6 +1,7 @@
package com.blogspot.e_kanivets.moneytracker.activity.base;
import android.content.Intent;
+import android.support.annotation.NonNull;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
@@ -9,14 +10,13 @@
import android.view.MenuItem;
import com.blogspot.e_kanivets.moneytracker.R;
-import com.blogspot.e_kanivets.moneytracker.activity.ChartsActivity;
+import com.blogspot.e_kanivets.moneytracker.activity.charts.ChartsActivity;
import com.blogspot.e_kanivets.moneytracker.activity.external.BackupActivity;
import com.blogspot.e_kanivets.moneytracker.activity.external.ImportExportActivity;
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;
-import com.crashlytics.android.answers.Answers;
-import com.crashlytics.android.answers.ContentViewEvent;
+import com.blogspot.e_kanivets.moneytracker.util.AnswersProxy;
import butterknife.Bind;
@@ -71,7 +71,7 @@ protected void initViews() {
}
@Override
- public boolean onNavigationItemSelected(MenuItem item) {
+ public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.nav_accounts:
showAccounts();
@@ -134,60 +134,36 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
}
private void showAccounts() {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Show Accounts")
- .putContentType("Button"));
-
+ AnswersProxy.get().logButton("Show Accounts");
startActivityForResult(new Intent(BaseDrawerActivity.this, AccountsActivity.class),
REQUEST_ACCOUNTS);
}
private void showRates() {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Show Rates")
- .putContentType("Button"));
-
+ AnswersProxy.get().logButton("Show Rates");
startActivityForResult(new Intent(BaseDrawerActivity.this, ExchangeRatesActivity.class),
REQUEST_RATES);
}
private void showCharts() {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Show Charts")
- .putContentType("Button"));
-
+ AnswersProxy.get().logButton("Show Charts");
startActivity(new Intent(BaseDrawerActivity.this, ChartsActivity.class));
}
private void showBackup() {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Show Backup")
- .putContentType("Button"));
-
+ AnswersProxy.get().logButton("Show Backup");
startActivityForResult(new Intent(BaseDrawerActivity.this, BackupActivity.class),
REQUEST_BACKUP);
}
private void showImportExport() {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Show Import Export")
- .putContentType("Button"));
-
+ AnswersProxy.get().logButton("Show Import Export");
startActivityForResult(new Intent(BaseDrawerActivity.this, ImportExportActivity.class),
REQUEST_IMPORT_EXPORT);
}
private void showSettings() {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Show Settings")
- .putContentType("Button"));
-
+ AnswersProxy.get().logButton("Show Settings");
startActivityForResult(new Intent(BaseDrawerActivity.this, SettingsActivity.class),
REQUEST_SETTINGS);
}
diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/ChartsActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/ChartsActivity.java
new file mode 100644
index 0000000..e64041a
--- /dev/null
+++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/ChartsActivity.java
@@ -0,0 +1,122 @@
+package com.blogspot.e_kanivets.moneytracker.activity.charts;
+
+import android.graphics.Color;
+import android.support.design.widget.TabLayout;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentPagerAdapter;
+import android.support.v4.view.ViewPager;
+
+import com.blogspot.e_kanivets.moneytracker.R;
+import com.blogspot.e_kanivets.moneytracker.activity.base.BaseBackActivity;
+import com.blogspot.e_kanivets.moneytracker.activity.charts.fragment.GraphFragment;
+import com.blogspot.e_kanivets.moneytracker.activity.charts.fragment.SummaryFragment;
+import com.blogspot.e_kanivets.moneytracker.controller.CurrencyController;
+import com.blogspot.e_kanivets.moneytracker.controller.data.ExchangeRateController;
+import com.blogspot.e_kanivets.moneytracker.controller.data.RecordController;
+import com.blogspot.e_kanivets.moneytracker.entity.data.Record;
+import com.blogspot.e_kanivets.moneytracker.report.ReportMaker;
+import com.blogspot.e_kanivets.moneytracker.report.chart.IMonthReport;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.inject.Inject;
+
+import butterknife.Bind;
+
+public class ChartsActivity extends BaseBackActivity {
+
+ @Inject
+ RecordController recordController;
+ @Inject
+ ExchangeRateController exchangeRateController;
+ @Inject
+ CurrencyController currencyController;
+
+ @Bind(R.id.tabs)
+ TabLayout tabLayout;
+ @Bind(R.id.view_pager)
+ ViewPager viewPager;
+
+ @Override
+ protected int getContentViewId() {
+ return R.layout.activity_charts;
+ }
+
+ @Override
+ protected boolean initData() {
+ boolean result = super.initData();
+ getAppComponent().inject(ChartsActivity.this);
+ return result;
+ }
+
+ @Override
+ protected void initViews() {
+ super.initViews();
+
+ setupViewPager(viewPager);
+ tabLayout.setupWithViewPager(viewPager);
+ }
+
+ protected String createRatesNeededList(String currency, List ratesNeeded) {
+ StringBuilder sb = new StringBuilder(getString(R.string.error_exchange_rates));
+
+ for (String str : ratesNeeded) {
+ sb.append("\n").append(str).append(getString(R.string.arrow)).append(currency);
+ }
+
+ return sb.toString();
+ }
+
+ private void setupViewPager(ViewPager viewPager) {
+ ReportMaker reportMaker = new ReportMaker(exchangeRateController);
+ String currency = currencyController.readDefaultCurrency();
+ List recordList = recordController.readAll();
+ List currencyNeeded = reportMaker.currencyNeeded(currency, recordList);
+
+ IMonthReport monthReport = null;
+ if (currencyNeeded.isEmpty()) monthReport = reportMaker.getMonthReport(currency, recordList);
+
+ Fragment graphFragment;
+ if (monthReport == null) {
+ graphFragment = GraphFragment.newInstance(createRatesNeededList(currency, currencyNeeded));
+ } else {
+ graphFragment = GraphFragment.newInstance(monthReport);
+ }
+
+ ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
+ adapter.addFragment(SummaryFragment.newInstance(monthReport), "Summary");
+ adapter.addFragment(graphFragment, "Graph");
+ viewPager.setAdapter(adapter);
+ }
+
+ class ViewPagerAdapter extends FragmentPagerAdapter {
+ private final List mFragmentList = new ArrayList<>();
+ private final List mFragmentTitleList = new ArrayList<>();
+
+ ViewPagerAdapter(FragmentManager manager) {
+ super(manager);
+ }
+
+ @Override
+ public Fragment getItem(int position) {
+ return mFragmentList.get(position);
+ }
+
+ @Override
+ public int getCount() {
+ return mFragmentList.size();
+ }
+
+ void addFragment(Fragment fragment, String title) {
+ mFragmentList.add(fragment);
+ mFragmentTitleList.add(title);
+ }
+
+ @Override
+ public CharSequence getPageTitle(int position) {
+ return mFragmentTitleList.get(position);
+ }
+ }
+}
diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/fragment/GraphFragment.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/fragment/GraphFragment.java
new file mode 100644
index 0000000..bb598f8
--- /dev/null
+++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/fragment/GraphFragment.java
@@ -0,0 +1,111 @@
+package com.blogspot.e_kanivets.moneytracker.activity.charts.fragment;
+
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.blogspot.e_kanivets.moneytracker.R;
+import com.blogspot.e_kanivets.moneytracker.report.chart.BarChartConverter;
+import com.blogspot.e_kanivets.moneytracker.report.chart.IMonthReport;
+import com.github.mikephil.charting.charts.BarChart;
+import com.github.mikephil.charting.data.BarData;
+
+import butterknife.Bind;
+import butterknife.ButterKnife;
+
+/**
+ * A simple {@link Fragment} subclass.
+ * Use the {@link GraphFragment#newInstance} factory method to
+ * create an instance of this fragment.
+ */
+public class GraphFragment extends Fragment {
+ private static final String ARG_MONTH_REPORT = "arg_month_report";
+ private static final String ARG_NO_DATA_TEXT = "arg_no_data_text";
+
+ @Nullable
+ private IMonthReport monthReport;
+ @Nullable
+ private String noDataText;
+
+ @Bind(R.id.bar_chart)
+ BarChart barChart;
+
+ public GraphFragment() {
+ // Required empty public constructor
+ }
+
+ /**
+ * Use this factory method to create a new instance of
+ * this fragment using the provided parameters.
+ *
+ * @param monthReport report for some period grouped by months.
+ * @return A new instance of fragment GraphFragment.
+ */
+ public static GraphFragment newInstance(@NonNull IMonthReport monthReport) {
+ GraphFragment fragment = new GraphFragment();
+ Bundle args = new Bundle();
+ args.putParcelable(ARG_MONTH_REPORT, monthReport);
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ /**
+ * Use this factory method to create a new instance of
+ * this fragment using the provided parameters.
+ *
+ * @param noDataText text that will be displayed in case of error.
+ * @return A new instance of fragment GraphFragment.
+ */
+ public static GraphFragment newInstance(@NonNull String noDataText) {
+ GraphFragment fragment = new GraphFragment();
+ Bundle args = new Bundle();
+ args.putString(ARG_NO_DATA_TEXT, noDataText);
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if (getArguments() != null) {
+ monthReport = getArguments().getParcelable(ARG_MONTH_REPORT);
+ noDataText = getArguments().getString(ARG_NO_DATA_TEXT);
+ }
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View rootView = inflater.inflate(R.layout.fragment_graph, container, false);
+ initViews(rootView);
+ return rootView;
+ }
+
+ private void initViews(@Nullable View rootView) {
+ if (rootView == null) return;
+ ButterKnife.bind(this, rootView);
+
+ if (monthReport == null) {
+ barChart.setNoDataText(noDataText);
+ } else {
+ BarChartConverter barChartConverter = new BarChartConverter(getActivity(), monthReport);
+
+ BarData barData = new BarData(barChartConverter.getXAxisValueList(),
+ barChartConverter.getBarDataSetList());
+ barData.setDrawValues(false);
+
+ barChart.setData(barData);
+ barChart.setDescription(null);
+ barChart.setVisibleXRangeMinimum(8);
+ barChart.setScaleYEnabled(false);
+ barChart.setVisibleXRangeMaximum(34);
+ barChart.setHighlightPerDragEnabled(false);
+ barChart.setHighlightPerTapEnabled(false);
+ }
+ }
+
+}
diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/fragment/SummaryFragment.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/fragment/SummaryFragment.java
new file mode 100644
index 0000000..30c57ce
--- /dev/null
+++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/charts/fragment/SummaryFragment.java
@@ -0,0 +1,76 @@
+package com.blogspot.e_kanivets.moneytracker.activity.charts.fragment;
+
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ListView;
+
+import com.blogspot.e_kanivets.moneytracker.R;
+import com.blogspot.e_kanivets.moneytracker.adapter.MonthSummaryAdapter;
+import com.blogspot.e_kanivets.moneytracker.report.chart.IMonthReport;
+
+import butterknife.Bind;
+import butterknife.ButterKnife;
+
+/**
+ * A simple {@link Fragment} subclass.
+ * Use the {@link SummaryFragment#newInstance} factory method to
+ * create an instance of this fragment.
+ */
+public class SummaryFragment extends Fragment {
+ private static final String ARG_MONTH_REPORT = "arg_month_report";
+
+ @Nullable
+ private IMonthReport monthReport;
+
+ @Bind(R.id.list_view)
+ ListView listView;
+
+ public SummaryFragment() {
+ // Required empty public constructor
+ }
+
+ /**
+ * Use this factory method to create a new instance of
+ * this fragment using the provided parameters.
+ *
+ * @param monthReport report for some period grouped by months.
+ * @return A new instance of fragment SummaryFragment.
+ */
+ public static SummaryFragment newInstance(@Nullable IMonthReport monthReport) {
+ SummaryFragment fragment = new SummaryFragment();
+ Bundle args = new Bundle();
+ args.putParcelable(ARG_MONTH_REPORT, monthReport);
+ fragment.setArguments(args);
+ return fragment;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ if (getArguments() != null) {
+ monthReport = getArguments().getParcelable(ARG_MONTH_REPORT);
+ }
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ View rootView = inflater.inflate(R.layout.fragment_summary, container, false);
+ initViews(rootView);
+ return rootView;
+ }
+
+ private void initViews(@Nullable View rootView) {
+ if (rootView == null) return;
+ ButterKnife.bind(this, rootView);
+
+ if (monthReport != null) {
+ listView.setAdapter(new MonthSummaryAdapter(getActivity(), monthReport));
+ }
+ }
+
+}
diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/exchange_rate/AddExchangeRateActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/exchange_rate/AddExchangeRateActivity.java
index 5b2adcf..84a647e 100644
--- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/exchange_rate/AddExchangeRateActivity.java
+++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/exchange_rate/AddExchangeRateActivity.java
@@ -14,10 +14,9 @@
import com.blogspot.e_kanivets.moneytracker.controller.FormatController;
import com.blogspot.e_kanivets.moneytracker.controller.data.ExchangeRateController;
import com.blogspot.e_kanivets.moneytracker.entity.ExchangeRatePair;
+import com.blogspot.e_kanivets.moneytracker.util.AnswersProxy;
import com.blogspot.e_kanivets.moneytracker.util.validator.ExchangeRatePairValidator;
import com.blogspot.e_kanivets.moneytracker.util.validator.IValidator;
-import com.crashlytics.android.answers.Answers;
-import com.crashlytics.android.answers.ContentViewEvent;
import java.util.ArrayList;
import java.util.List;
@@ -127,17 +126,9 @@ public boolean onOptionsItemSelected(MenuItem item) {
}
private void tryAddExchangeRate() {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Done Exchange Rate")
- .putContentType("Button"));
-
+ AnswersProxy.get().logButton("Done Exchange Rate");
if (addExchangeRate()) {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Done Exchange Rate")
- .putContentType("Event"));
-
+ AnswersProxy.get().logEvent("Done Exchange Rate");
setResult(RESULT_OK);
finish();
}
diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/exchange_rate/ExchangeRatesActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/exchange_rate/ExchangeRatesActivity.java
index 1796cc1..4c2e7bf 100644
--- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/exchange_rate/ExchangeRatesActivity.java
+++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/exchange_rate/ExchangeRatesActivity.java
@@ -14,9 +14,8 @@
import com.blogspot.e_kanivets.moneytracker.adapter.ExchangeRateAdapter;
import com.blogspot.e_kanivets.moneytracker.controller.data.ExchangeRateController;
import com.blogspot.e_kanivets.moneytracker.entity.ExchangeRatePair;
+import com.blogspot.e_kanivets.moneytracker.util.AnswersProxy;
import com.blogspot.e_kanivets.moneytracker.util.ExchangeRatesSummarizer;
-import com.crashlytics.android.answers.Answers;
-import com.crashlytics.android.answers.ContentViewEvent;
import java.util.Collections;
import java.util.List;
@@ -81,11 +80,7 @@ public boolean onContextItemSelected(MenuItem item) {
}
public void deleteExchangeRate(int position) {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Delete Exchange Rate")
- .putContentType("Button"));
-
+ AnswersProxy.get().logButton("Delete Exchange Rate");
rateController.deleteExchangeRatePair(exchangeRateList.get(position));
update();
setResult(RESULT_OK);
@@ -93,22 +88,14 @@ public void deleteExchangeRate(int position) {
@OnClick(R.id.btn_add_exchange_rate)
public void addExchangeRate() {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Add Exchange Rate")
- .putContentType("Button"));
-
+ AnswersProxy.get().logButton("Add Exchange Rate");
Intent intent = new Intent(ExchangeRatesActivity.this, AddExchangeRateActivity.class);
startActivityForResult(intent, REQUEST_ADD_EXCHANGE_RATE);
}
@OnItemClick(R.id.list_view)
public void addExchangeRateOnBaseOfExisted(int position) {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Edit Exchange Rate")
- .putContentType("Button"));
-
+ AnswersProxy.get().logButton("Edit Exchange Rate");
if (position < 0 || position >= exchangeRateList.size()) return;
Intent intent = new Intent(ExchangeRatesActivity.this, AddExchangeRateActivity.class);
intent.putExtra(AddExchangeRateActivity.KEY_EXCHANGE_RATE, exchangeRateList.get(position));
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 3460de8..9d59c04 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
@@ -12,8 +12,7 @@
import com.blogspot.e_kanivets.moneytracker.activity.base.BaseBackActivity;
import com.blogspot.e_kanivets.moneytracker.controller.BackupController;
import com.blogspot.e_kanivets.moneytracker.controller.PreferenceController;
-import com.crashlytics.android.answers.Answers;
-import com.crashlytics.android.answers.ContentViewEvent;
+import com.blogspot.e_kanivets.moneytracker.util.AnswersProxy;
import com.dropbox.client2.DropboxAPI;
import com.dropbox.client2.android.AndroidAuthSession;
import com.dropbox.client2.session.AppKeyPair;
@@ -91,20 +90,12 @@ protected void onResume() {
@OnClick(R.id.btn_backup_now)
public void backupNow() {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Make Backup")
- .putContentType("Button"));
-
+ AnswersProxy.get().logButton("Make Backup");
startProgress(getString(R.string.making_backup));
backupController.makeBackup(dbApi, new BackupController.OnBackupListener() {
@Override
public void onBackupSuccess() {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Backup success")
- .putContentType("Event"));
-
+ AnswersProxy.get().logEvent("Backup success");
Timber.d("Backup success.");
if (isFinishing()) return;
@@ -114,11 +105,7 @@ public void onBackupSuccess() {
@Override
public void onBackupFailure(String reason) {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Backup failure")
- .putContentType("Event"));
-
+ AnswersProxy.get().logEvent("Backup failure");
Timber.d("Backup failure.");
if (isFinishing()) return;
@@ -132,11 +119,7 @@ public void onBackupFailure(String reason) {
@OnItemClick(R.id.list_view)
public void restoreBackupClicked(int position) {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Restore backup")
- .putContentType("Button"));
-
+ AnswersProxy.get().logButton("Restore backup");
final String backupName = listView.getAdapter().getItem(position).toString();
AlertDialog.Builder builder = new AlertDialog.Builder(BackupActivity.this);
@@ -157,11 +140,7 @@ private void restoreBackup(final String backupName) {
backupController.restoreBackup(dbApi, backupName, new BackupController.OnRestoreBackupListener() {
@Override
public void onRestoreSuccess() {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Restore Success")
- .putContentType("Event"));
-
+ AnswersProxy.get().logEvent("Restore Success");
Timber.d("Restore success.");
if (isFinishing()) return;
@@ -184,11 +163,7 @@ public void onDismiss(DialogInterface dialog) {
@Override
public void onRestoreFailure(String reason) {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Restore Failure")
- .putContentType("Event"));
-
+ AnswersProxy.get().logEvent("Restore Failure");
Timber.d("Restore failure.");
if (isFinishing()) return;
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 ec8f2ac..e80c1a9 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
@@ -15,8 +15,7 @@
import com.blogspot.e_kanivets.moneytracker.controller.external.ExportController;
import com.blogspot.e_kanivets.moneytracker.controller.external.ImportController;
import com.blogspot.e_kanivets.moneytracker.entity.data.Record;
-import com.crashlytics.android.answers.Answers;
-import com.crashlytics.android.answers.ContentViewEvent;
+import com.blogspot.e_kanivets.moneytracker.util.AnswersProxy;
import java.io.File;
import java.io.FileNotFoundException;
@@ -71,11 +70,7 @@ public boolean onOptionsItemSelected(MenuItem item) {
}
public void showHelp() {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Show Help")
- .putContentType("Button"));
-
+ AnswersProxy.get().logButton("Show Help");
AlertDialog.Builder builder = new AlertDialog.Builder(ImportExportActivity.this);
builder.setTitle(R.string.help)
.setMessage(R.string.import_help)
@@ -85,11 +80,7 @@ public void showHelp() {
@OnClick(R.id.btn_import)
public void importRecords() {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Import Records")
- .putContentType("Button"));
-
+ AnswersProxy.get().logButton("Import Records");
final String data = etImportData.getText().toString().trim();
AsyncTask importTask = new AsyncTask() {
@@ -118,11 +109,7 @@ protected void onPostExecute(Integer recordCount) {
@OnClick(R.id.btn_export)
public void exportRecords() {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Export Records")
- .putContentType("Button"));
-
+ AnswersProxy.get().logButton("Export Records");
List records = exportController.getRecordsForExport(0, Long.MAX_VALUE);
File exportDir = new File(getCacheDir(), "export");
@@ -154,11 +141,7 @@ public void exportRecords() {
}
private void shareExportedRecords(@NonNull File exportFile) {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Share Records")
- .putContentType("Event"));
-
+ AnswersProxy.get().logEvent("Share Records");
Uri fileUri = FileProvider.getUriForFile(ImportExportActivity.this, getPackageName(), exportFile);
Intent sendIntent = new Intent();
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 bbf4c96..5097969 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
@@ -31,11 +31,10 @@
import com.blogspot.e_kanivets.moneytracker.entity.data.Account;
import com.blogspot.e_kanivets.moneytracker.entity.data.Record;
import com.blogspot.e_kanivets.moneytracker.ui.AddRecordUiDecorator;
+import com.blogspot.e_kanivets.moneytracker.util.AnswersProxy;
import com.blogspot.e_kanivets.moneytracker.util.CategoryAutoCompleter;
import com.blogspot.e_kanivets.moneytracker.util.validator.IValidator;
import com.blogspot.e_kanivets.moneytracker.util.validator.RecordValidator;
-import com.crashlytics.android.answers.Answers;
-import com.crashlytics.android.answers.ContentViewEvent;
import java.util.ArrayList;
import java.util.Calendar;
@@ -204,11 +203,7 @@ public boolean onOptionsItemSelected(MenuItem item) {
@OnClick(R.id.tv_date)
public void selectDate() {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Select Date")
- .putContentType("Button"));
-
+ AnswersProxy.get().logButton("Select Date");
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timestamp);
DatePickerDialog dialog = new DatePickerDialog(AddRecordActivity.this, uiDecorator.getTheme(type),
@@ -235,11 +230,7 @@ public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth
@OnClick(R.id.tv_time)
public void selectTime() {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Show Time")
- .putContentType("Button"));
-
+ AnswersProxy.get().logButton("Show Time");
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(timestamp);
TimePickerDialog dialog = new TimePickerDialog(AddRecordActivity.this, uiDecorator.getTheme(type),
@@ -305,17 +296,9 @@ private void presentSpinnerAccount() {
}
private void tryRecord() {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Done Record")
- .putContentType("Button"));
-
+ AnswersProxy.get().logButton("Done Record");
if (addRecord()) {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Done Record")
- .putContentType("Event"));
-
+ AnswersProxy.get().logEvent("Done Record");
setResult(RESULT_OK);
finish();
}
diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/record/MainActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/record/MainActivity.java
index 9adf563..bf72a80 100644
--- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/record/MainActivity.java
+++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/record/MainActivity.java
@@ -26,8 +26,7 @@
import com.blogspot.e_kanivets.moneytracker.ui.AppRateDialog;
import com.blogspot.e_kanivets.moneytracker.ui.PeriodSpinner;
import com.blogspot.e_kanivets.moneytracker.ui.presenter.ShortSummaryPresenter;
-import com.crashlytics.android.answers.Answers;
-import com.crashlytics.android.answers.ContentViewEvent;
+import com.blogspot.e_kanivets.moneytracker.util.AnswersProxy;
import java.util.ArrayList;
import java.util.Collections;
@@ -126,11 +125,7 @@ public void onPeriodSelected(Period period) {
@OnItemClick(R.id.list_view)
public void editRecord(int position) {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Edit Record")
- .putContentType("Button"));
-
+ AnswersProxy.get().logButton("Edit Record");
// Minus one because of list view's header view
Record record = recordList.get(position - 1);
startAddRecordActivity(record, AddRecordActivity.Mode.MODE_EDIT, record.getType());
@@ -138,30 +133,18 @@ public void editRecord(int position) {
@OnClick(R.id.btn_add_expense)
public void addExpense() {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Add Expense")
- .putContentType("Button"));
-
+ AnswersProxy.get().logButton("Add Expense");
startAddRecordActivity(null, AddRecordActivity.Mode.MODE_ADD, Record.TYPE_EXPENSE);
}
@OnClick(R.id.btn_add_income)
public void addIncome() {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Add Income")
- .putContentType("Button"));
-
+ AnswersProxy.get().logButton("Add Income");
startAddRecordActivity(null, AddRecordActivity.Mode.MODE_ADD, Record.TYPE_INCOME);
}
public void showReport() {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Show Report")
- .putContentType("Button"));
-
+ AnswersProxy.get().logButton("Show Report");
Intent intent = new Intent(MainActivity.this, ReportActivity.class);
intent.putExtra(ReportActivity.KEY_PERIOD, period);
intent.putExtra(ReportActivity.KEY_RECORD_LIST, (ArrayList) recordList);
@@ -206,11 +189,7 @@ protected void update() {
}
private void showAppRateDialog() {
- // Answers event
- Answers.getInstance().logContentView(new ContentViewEvent()
- .putContentName("Show App Rate Dialog")
- .putContentType("Button"));
-
+ AnswersProxy.get().logEvent("Show App Rate Dialog");
AppRateDialog dialog = new AppRateDialog(MainActivity.this);
dialog.setCanceledOnTouchOutside(false);
dialog.show();
diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/MonthSummaryAdapter.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/MonthSummaryAdapter.java
new file mode 100644
index 0000000..553b0f7
--- /dev/null
+++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/adapter/MonthSummaryAdapter.java
@@ -0,0 +1,113 @@
+package com.blogspot.e_kanivets.moneytracker.adapter;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.support.annotation.NonNull;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.TextView;
+
+import com.blogspot.e_kanivets.moneytracker.MtApp;
+import com.blogspot.e_kanivets.moneytracker.R;
+import com.blogspot.e_kanivets.moneytracker.controller.FormatController;
+import com.blogspot.e_kanivets.moneytracker.report.chart.IMonthReport;
+
+import java.text.SimpleDateFormat;
+
+import javax.inject.Inject;
+
+import butterknife.Bind;
+import butterknife.ButterKnife;
+
+/**
+ * Adapter to display a report grouped by months.
+ * Created on 1/13/17.
+ *
+ * @author Evgenii Kanivets
+ */
+
+@SuppressWarnings("WeakerAccess")
+public class MonthSummaryAdapter extends BaseAdapter {
+
+ @Inject
+ FormatController formatController;
+
+ @NonNull
+ private Context context;
+ @NonNull
+ private IMonthReport monthReport;
+ @NonNull
+ private final SimpleDateFormat dateFormat;
+
+ @SuppressLint("SimpleDateFormat")
+ public MonthSummaryAdapter(@NonNull Context context, @NonNull IMonthReport monthReport) {
+ MtApp.get().getAppComponent().inject(MonthSummaryAdapter.this);
+
+ this.context = context;
+ this.monthReport = monthReport;
+
+ if (monthReport.getMonthList().size() != monthReport.getIncomeList().size()
+ || monthReport.getIncomeList().size() != monthReport.getExpenseList().size()) {
+ throw new IllegalArgumentException("Broken report data");
+ }
+
+ dateFormat = new SimpleDateFormat("MMM, yyyy");
+ }
+
+ @Override
+ public int getCount() {
+ return monthReport.getMonthList().size();
+ }
+
+ @Override
+ public Object getItem(int position) {
+ return null;
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return position;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ ViewHolder viewHolder;
+
+ if (convertView == null) {
+ LayoutInflater layoutInflater = LayoutInflater.from(context);
+
+ convertView = layoutInflater.inflate(R.layout.view_month_summary, parent, false);
+ viewHolder = new ViewHolder(convertView);
+
+ convertView.setTag(viewHolder);
+ } else viewHolder = (ViewHolder) convertView.getTag();
+
+ // Reverse a report
+ int index = monthReport.getMonthList().size() - position - 1;
+
+ String month = dateFormat.format(monthReport.getMonthList().get(index));
+ double totalIncome = monthReport.getIncomeList().get(index);
+ double totalExpense = monthReport.getExpenseList().get(index);
+
+ viewHolder.tvMonth.setText(month);
+ viewHolder.tvTotalIncome.setText(formatController.formatSignedAmount(totalIncome));
+ viewHolder.tvTotalExpense.setText(formatController.formatSignedAmount(-totalExpense));
+
+ return convertView;
+ }
+
+ public static class ViewHolder {
+ @Bind(R.id.tv_month)
+ TextView tvMonth;
+ @Bind(R.id.tv_total_income)
+ TextView tvTotalIncome;
+ @Bind(R.id.tv_total_expense)
+ TextView tvTotalExpense;
+
+ public ViewHolder(View view) {
+ ButterKnife.bind(this, view);
+ }
+ }
+}
diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/CurrencyController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/CurrencyController.java
index 817d09f..adbae7a 100644
--- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/CurrencyController.java
+++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/CurrencyController.java
@@ -73,6 +73,7 @@ private List fetchCurrencies() {
}
currencyList.add(DbHelper.DEFAULT_ACCOUNT_CURRENCY);
+ currencyList.add("BYN"); // New belorussian ruble
Collections.sort(currencyList);
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 b3894ec..8396fe0 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
@@ -1,6 +1,6 @@
package com.blogspot.e_kanivets.moneytracker.di;
-import com.blogspot.e_kanivets.moneytracker.activity.ChartsActivity;
+import com.blogspot.e_kanivets.moneytracker.activity.charts.ChartsActivity;
import com.blogspot.e_kanivets.moneytracker.activity.external.BackupActivity;
import com.blogspot.e_kanivets.moneytracker.activity.external.ImportExportActivity;
import com.blogspot.e_kanivets.moneytracker.activity.ReportActivity;
@@ -15,6 +15,7 @@
import com.blogspot.e_kanivets.moneytracker.adapter.AccountAdapter;
import com.blogspot.e_kanivets.moneytracker.adapter.ExchangeRateAdapter;
import com.blogspot.e_kanivets.moneytracker.adapter.ExpandableListReportAdapter;
+import com.blogspot.e_kanivets.moneytracker.adapter.MonthSummaryAdapter;
import com.blogspot.e_kanivets.moneytracker.adapter.RecordAdapter;
import com.blogspot.e_kanivets.moneytracker.di.module.repo.CachedRepoModule;
import com.blogspot.e_kanivets.moneytracker.di.module.ControllerModule;
@@ -75,4 +76,6 @@ public interface AppComponent {
void inject(ShortSummaryPresenter shortSummaryPresenter);
void inject(ExchangeRateAdapter exchangeRateAdapter);
+
+ void inject(MonthSummaryAdapter monthSummaryAdapter);
}
diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/IMonthReport.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/IMonthReport.java
index 00e449a..e083604 100644
--- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/IMonthReport.java
+++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/IMonthReport.java
@@ -1,5 +1,6 @@
package com.blogspot.e_kanivets.moneytracker.report.chart;
+import android.os.Parcelable;
import android.support.annotation.NonNull;
import java.util.List;
@@ -11,7 +12,7 @@
*
* @author Evgenii Kanivets
*/
-public interface IMonthReport {
+public interface IMonthReport extends Parcelable {
/**
* @return code of report currency
*/
diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/MonthReport.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/MonthReport.java
index 143f73e..af15e03 100644
--- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/MonthReport.java
+++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/report/chart/MonthReport.java
@@ -1,5 +1,7 @@
package com.blogspot.e_kanivets.moneytracker.report.chart;
+import android.os.Parcel;
+import android.os.Parcelable;
import android.support.annotation.NonNull;
import com.blogspot.e_kanivets.moneytracker.entity.data.ExchangeRate;
@@ -21,7 +23,6 @@
*/
public class MonthReport implements IMonthReport {
private final String currency;
- private final IExchangeRateProvider rateProvider;
private final List monthList;
@@ -30,9 +31,13 @@ public MonthReport(List recordList, String currency, IExchangeRateProvid
throw new NullPointerException("Params can't be null");
this.currency = currency;
- this.rateProvider = rateProvider;
- monthList = generateReport(recordList);
+ monthList = generateReport(recordList, rateProvider);
+ }
+
+ protected MonthReport(Parcel in) {
+ currency = in.readString();
+ monthList = in.createTypedArrayList(MonthNode.CREATOR);
}
@NonNull
@@ -82,7 +87,7 @@ public List getExpenseList() {
* @return sorted by timestamp list of {@link MonthNode}
*/
@NonNull
- private List generateReport(List recordList) {
+ private List generateReport(List recordList, IExchangeRateProvider rateProvider) {
SortedMap monthMap = new TreeMap<>();
for (Record record : recordList) {
@@ -133,35 +138,76 @@ private long getMonthTimestamp(long timestamp) {
return calendar.getTimeInMillis();
}
- private static class MonthNode {
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(currency);
+ dest.writeTypedList(monthList);
+ }
+
+ private static class MonthNode implements Parcelable {
private long timestamp;
private double totalIncome;
private double totalExpense;
public MonthNode(long timestamp) {
this.timestamp = timestamp;
- totalExpense = 0;
- totalIncome = 0;
+ this.totalExpense = 0;
+ this.totalIncome = 0;
+ }
+
+ protected MonthNode(Parcel in) {
+ timestamp = in.readLong();
+ totalIncome = in.readDouble();
+ totalExpense = in.readDouble();
}
- public void addIncome(double income) {
+ public static final Creator CREATOR = new Creator() {
+ @Override
+ public MonthNode createFromParcel(Parcel in) {
+ return new MonthNode(in);
+ }
+
+ @Override
+ public MonthNode[] newArray(int size) {
+ return new MonthNode[size];
+ }
+ };
+
+ void addIncome(double income) {
totalIncome += income;
}
- public void addExpense(double expense) {
+ void addExpense(double expense) {
totalExpense += expense;
}
- public long getTimestamp() {
+ long getTimestamp() {
return timestamp;
}
- public double getTotalIncome() {
+ double getTotalIncome() {
return totalIncome;
}
- public double getTotalExpense() {
+ double getTotalExpense() {
return totalExpense;
}
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeLong(timestamp);
+ dest.writeDouble(totalIncome);
+ dest.writeDouble(totalExpense);
+ }
}
}
diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/AnswersProxy.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/AnswersProxy.java
new file mode 100644
index 0000000..d285251
--- /dev/null
+++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/util/AnswersProxy.java
@@ -0,0 +1,61 @@
+package com.blogspot.e_kanivets.moneytracker.util;
+
+import android.support.annotation.Nullable;
+
+import com.crashlytics.android.answers.Answers;
+import com.crashlytics.android.answers.ContentViewEvent;
+
+/**
+ * Util class that wraps the Answers event analytic, to disable it in Debug mode and simplify
+ * an interface.
+ * Created on 1/11/17.
+ *
+ * @author Evgenii Kanivets
+ */
+
+public class AnswersProxy {
+ private static AnswersProxy instance;
+
+ public static AnswersProxy get() {
+ if (instance == null) {
+ instance = new AnswersProxy();
+ }
+ return instance;
+ }
+
+ private AnswersProxy() {
+
+ }
+
+ private boolean enabled;
+
+ public void setEnabled(boolean enabled) {
+ this.enabled = enabled;
+ }
+
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ public boolean logEvent(@Nullable String eventName) {
+ if (enabled) {
+ Answers.getInstance().logContentView(new ContentViewEvent()
+ .putContentName(eventName)
+ .putContentType("Event"));
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public boolean logButton(@Nullable String buttonName) {
+ if (enabled) {
+ Answers.getInstance().logContentView(new ContentViewEvent()
+ .putContentName(buttonName)
+ .putContentType("Button"));
+ return true;
+ } else {
+ return false;
+ }
+ }
+}
diff --git a/app/src/main/res/layout/activity_charts.xml b/app/src/main/res/layout/activity_charts.xml
index 9c3df6a..ca2b2a2 100644
--- a/app/src/main/res/layout/activity_charts.xml
+++ b/app/src/main/res/layout/activity_charts.xml
@@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
- tools:context="com.blogspot.e_kanivets.moneytracker.activity.ChartsActivity">
+ tools:context="com.blogspot.e_kanivets.moneytracker.activity.charts.ChartsActivity">
+
+
-
-
-
-
-
+ app:layout_behavior="@string/appbar_scrolling_view_behavior" />
-
\ No newline at end of file
+
diff --git a/app/src/main/res/layout/fragment_graph.xml b/app/src/main/res/layout/fragment_graph.xml
new file mode 100644
index 0000000..a5d666f
--- /dev/null
+++ b/app/src/main/res/layout/fragment_graph.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
diff --git a/app/src/main/res/layout/fragment_summary.xml b/app/src/main/res/layout/fragment_summary.xml
new file mode 100644
index 0000000..ad590ce
--- /dev/null
+++ b/app/src/main/res/layout/fragment_summary.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
diff --git a/app/src/main/res/layout/view_month_summary.xml b/app/src/main/res/layout/view_month_summary.xml
new file mode 100644
index 0000000..d42da18
--- /dev/null
+++ b/app/src/main/res/layout/view_month_summary.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
index fbe6428..f7c0927 100644
--- a/app/src/main/res/values-ru/strings.xml
+++ b/app/src/main/res/values-ru/strings.xml
@@ -56,7 +56,7 @@
Счет по умолчанию
Валюта по умолчанию
- Графики
+ Итоги
Доходы
Расходы
diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml
index 27eabcf..6639e64 100644
--- a/app/src/main/res/values-uk/strings.xml
+++ b/app/src/main/res/values-uk/strings.xml
@@ -56,7 +56,7 @@
Рахунок за замовчуванням
Валюта за замовчуванням
- Графіки
+ Підсумки
Доходи
Витрати
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 532ee5f..b7287f6 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -59,7 +59,7 @@
%1$s - %2$s
Default currency
- Charts
+ Results
Incomes
Expenses
@@ -122,5 +122,8 @@
Can\'t convert between same currencies.
Can\'t create a record in future.
At least one account is needed.
+
+
+ Hello blank fragment