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