From 611dfa00a54518860986f8350977a5266188ea1c Mon Sep 17 00:00:00 2001 From: Janet Do Date: Thu, 2 Feb 2017 21:22:50 -0500 Subject: [PATCH] Export data from the statistics screen Closes #27 --- .../habits/show/ShowHabitsMenu.java | 36 +++++++- .../drawable-hdpi/ic_action_download_dark.png | Bin 0 -> 249 bytes .../ic_action_download_light.png | Bin 0 -> 280 bytes .../drawable-mdpi/ic_action_download_dark.png | Bin 0 -> 198 bytes .../ic_action_download_light.png | Bin 0 -> 236 bytes .../ic_action_download_dark.png | Bin 0 -> 279 bytes .../ic_action_download_light.png | Bin 0 -> 319 bytes .../ic_action_download_dark.png | Bin 0 -> 366 bytes .../ic_action_download_light.png | Bin 0 -> 397 bytes app/src/main/res/menu/show_habit.xml | 6 ++ app/src/main/res/values-de/strings.xml | 8 +- app/src/main/res/values/attrs.xml | 1 + app/src/main/res/values/strings.xml | 1 + app/src/main/res/values/styles.xml | 1 + .../habits/show/ShowHabitsMenuTest.java | 81 ++++++++++++++++++ 15 files changed, 129 insertions(+), 5 deletions(-) create mode 100644 app/src/main/res/drawable-hdpi/ic_action_download_dark.png create mode 100644 app/src/main/res/drawable-hdpi/ic_action_download_light.png create mode 100644 app/src/main/res/drawable-mdpi/ic_action_download_dark.png create mode 100644 app/src/main/res/drawable-mdpi/ic_action_download_light.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_action_download_dark.png create mode 100644 app/src/main/res/drawable-xhdpi/ic_action_download_light.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_action_download_dark.png create mode 100644 app/src/main/res/drawable-xxhdpi/ic_action_download_light.png create mode 100644 app/src/test/java/org/isoron/uhabits/activities/habits/show/ShowHabitsMenuTest.java diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitsMenu.java b/app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitsMenu.java index 92e5af582..93a507154 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitsMenu.java +++ b/app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitsMenu.java @@ -24,6 +24,10 @@ import android.view.*; import org.isoron.uhabits.*; import org.isoron.uhabits.activities.*; +import org.isoron.uhabits.models.*; +import org.isoron.uhabits.tasks.*; + +import java.util.*; import javax.inject.*; @@ -33,12 +37,38 @@ public class ShowHabitsMenu extends BaseMenu @NonNull private final ShowHabitScreen screen; + @NonNull + private final Habit habit; + + @NonNull + private final TaskRunner taskRunner; + + @NonNull + private ExportCSVTaskFactory exportCSVFactory; + @Inject public ShowHabitsMenu(@NonNull BaseActivity activity, - @NonNull ShowHabitScreen screen) + @NonNull ShowHabitScreen screen, + @NonNull Habit habit, + @NonNull ExportCSVTaskFactory exportCSVFactory, + @NonNull TaskRunner taskRunner) { super(activity); this.screen = screen; + this.habit = habit; + this.taskRunner = taskRunner; + this.exportCSVFactory = exportCSVFactory; + } + + public void downloadHabit() + { + List selected = new LinkedList<>(); + selected.add(habit); + ExportCSVTask task = exportCSVFactory.create(selected, filename -> { + if (filename != null) screen.showSendFileScreen(filename); + else screen.showMessage(R.string.could_not_export); + }); + taskRunner.execute(task); } @Override @@ -50,6 +80,10 @@ public class ShowHabitsMenu extends BaseMenu screen.showEditHabitDialog(); return true; + case R.id.download: + this.downloadHabit(); + return true; + default: return false; } diff --git a/app/src/main/res/drawable-hdpi/ic_action_download_dark.png b/app/src/main/res/drawable-hdpi/ic_action_download_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..cd22795b4b6ac0f8d0ca9c20492a1701d2224199 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpUt1D-C9Ar-gYPP64YC5$sci(csUt?djGXZBrDHz&ne=| zIC{E6myt!lfq^lV{Y1yr+?-bnI3(`H?Ebns50I5=-`ds w^aCe9_oHujZ)x*yPDuFx(Pgg&ebxsLQ0FZEG;s5{u literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_action_download_light.png b/app/src/main/res/drawable-hdpi/ic_action_download_light.png new file mode 100644 index 0000000000000000000000000000000000000000..77b048f7e745752994415e2c7cc0a2a957b03ca2 GIT binary patch literal 280 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpUt`<^b2Ar-gY&e+X$$UvgC`nR_XO}LlV+LwIFn__;Z&T8h z=B;fAdX>>r`PXX?8ha^p{j;@?pgzi0igf49_cQS;naY>hE30@9jGH6>?F%hvG& cI*%db8Smcvg&cp^T1$htp00i_>zopr0HXDGX8-^I literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_action_download_dark.png b/app/src/main/res/drawable-mdpi/ic_action_download_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..47fda04ffabd4dca5c007bc9d308b29023a00abf GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJUQZXtkcwMxry24!DDb#)CSIH< z{UGVlgC}nlpnxUfflh*|15*{p zS6$y7UJa+uWvy!1tE4OF!8Adzq{xM3?;gcN<&*b!aNK=5mBa3*b4&X4biw;4Eb}cH w*@fH%Hz>p%JmMp0z@$CN@!tfaoA1jR-xRe*7=P-x0(2OIr>mdKI;Vst0O`I-6aWAK literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/ic_action_download_light.png b/app/src/main/res/drawable-mdpi/ic_action_download_light.png new file mode 100644 index 0000000000000000000000000000000000000000..6f5078ee897c6d269a69c597d7c138125266e50f GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ&7LlfAr-fh6C_v{Cx}eoaB_B@ z>FeWjWn46o@EAkSZotcGCBuJQa?;C0OFj1s zSBpg4FKFK=v`SLYUCz(Iwpqkr#_N*@7fhNc#Wz8Hu?S0YaBy&Bm+XQ?iw^O9=`^yG kSW>=)*OJTa-~x6Ag-dI8U+U|206L$+)78&qol`;+03)(gfdBvi literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_action_download_dark.png b/app/src/main/res/drawable-xhdpi/ic_action_download_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..6700e66946c5e60318dde184e9b49b6809ecc1b3 GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=_dH!3Ln>~)ongy$$U(p@cxA?P zWtNXDO{sYa$@#AXFD?BLb1!qQljD*7cXu3q^QQX4*2eEQbQFD=fqH?Ul0$LJrr;-0 z{)|>PRf}X9IUE?61R5Av6c`ve65;Lcz{yAOW z5zzmqo8#+A`&#uYn*0x5$KE^1_B2W2BsUF8z#z5-Tv$wE5vagkGP`! VqOLq!%CrF_;OXk;vd$@?2>^3;Yaajr literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/ic_action_download_light.png b/app/src/main/res/drawable-xhdpi/ic_action_download_light.png new file mode 100644 index 0000000000000000000000000000000000000000..67109515418d44b5082eef4b388801967e5d9e90 GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU}W=jaSW-r^>)Tyz9s_^w@4Gc zeGSKEO0>0o+B`!-&0PMl>!SCMZ{Olm(UIU@xHIOQ=evj<_c`~f`U(Nf0D>9qCcfXV z-KzHZX`03Iq_R%q^e5qh-M_t`FIDwwLz@ z_cZ97-nMRKc*Y6Nt75Jj1;2_One?E^{%C8zs$hS%>;(aQ-^P?r}l-U;o<$_J1a@gfi=g9MU@c{l9RSw48(B zwOgB4yPqjq?ymLn(r2lUR%=#s1D(>cYL(wRoBc<1lFv+h$qn&?L6`o^C-qCXjSTZZ N0-mmZF6*2Ung9&NgmM4? literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_download_dark.png b/app/src/main/res/drawable-xxhdpi/ic_action_download_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..4c09750f4ae78a066944a88c51b1baf3cb1458a1 GIT binary patch literal 366 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7Ro>U^Mk~aSW-r_4byvA5)-6Lt@y1 zgKayQ%p6=F%4O)hxZ9+vUBLcHAjR@c<{p)xj6@a5XLpW&S6!}V`9CJD%|MC~Xc7<{ zIIwHo>}8ejGnbiF)iy-V3idbN9LUJxz`!Wrz`!EFfM70YZMCb@|GIzk8^Z&iPMx23 zMdE?t*?q^C-pjg{`7Ya*^*Kj-&-DFk%YL%D+z8qKr$>3q=07~jIkThd+{~YqZa)2A z^x@^H_pf6;%s5V)B1>i_XWSL`(x#Q=-j8r?>N`}Iq;pu-?~vfG5Keq z`oT}k$`N%Bu1|c*K99xx&Vk7f+P5|;%j`{g`f+pX^feDSrtvd8`FrHklxIsP%)Bm< z5PIOhlm2I|1_mY$g$4#w)(XGRVJCEKwlhKe$`G(Y|B&9KbJdc(dqEU<~neaSW-r_4d|YzrzM1Y!}{j zFd7=CJ5G$cKC|n{ffLLI8#jMGKl#J99YK;4qcopbowK|Yd;3}4zKy!2TbY2y06|0N z(>d#dyv`?I`M0^`i_7h|+qA#h29;WAF)%7%LniqWZKs`s`&Z5Rd^dto#_sit_xIkG ziJxV?Pt*th(7*ayZ|21P+Gn3##Pv;aO8cKRJASS|YgW%T`9j@iZN5ayv+LiM zZt1x0w|4S{FKyLc97_c!`#W*|%l&w^e-?}O|M#{Jvzw;=U-#2-a>7$~zozoK2PzRi z8^5=>&i|}EgXJtgkK<=%=L>%h2$>umF8#ve@QEuGh;`oWtH}TW literal 0 HcmV?d00001 diff --git a/app/src/main/res/menu/show_habit.xml b/app/src/main/res/menu/show_habit.xml index ec81337c8..e318eaf34 100644 --- a/app/src/main/res/menu/show_habit.xml +++ b/app/src/main/res/menu/show_habit.xml @@ -21,6 +21,12 @@ + + "<b>Habit Wertung</b> -Um dir deine kleinen Schwächen zu zeigen hat Loop einen Algorithmus, um deine Gewohnheiten zu erkennen. Jede Wiederholung verstärkt diese und jedes Aussetzen schwächt sie. Aber ein paar Verfehlungen nach langem Durchhalten machen natürlich nicht gleich alles zu Nichte." +Um dir deine kleinen Schwächen zu zeigen hat Loop einen Algorithmus entwickelt, um deine Gewohnheiten zu erkennen. Jede Wiederholung verstärkt diese und jedes Aussetzen schwächt sie. Aber ein paar Fehltage nach langem Durchhalten machen natürlich nicht gleich alles zu Nichte." "<b>Statistiken</b> -Schau dir an, wie sich deine Gewohnheiten im Laufe der Zeit entwickelt haben. Schau auf die schönen Diagramme und gehe zurück im gesamten Verlauf." +Schau dir an, wie sich deine Gewohnheiten im Laufe der Zeit entwickelt haben. Schaue dir die Diagramme an oder gehe zurück im gesamten Verlauf." "<b>Flexible Zeiten</b> Unterstützt sowohl tägliche Vorgaben, als auch komplexere Pläne, wie etwa 3 Mal pro Woche; einmal in jeder anderen Woche; oder jeden anderen Tag." "<b>Erinnerungen</b> -Erstelle individuelle Erinnerungen und wann diese dich benachrichtigen sollen. Kontrolliere deine Vorhaben ganz einfach und lehne sie bei Bedarf direkt ab, ohne die App zu öffnen." +Erstelle individuelle Erinnerungen und wann diese dich benachrichtigen sollen. Kontrolliere dein Vorhaben ganz einfach und lehne sie bei Bedarf direkt ab, ohne die App zu öffnen." "<b>Komplett werbefrei und Open Source</b> Es gibt absolut keine Werbung, nervende Einblendungen oder merkwürdige Berechtigungen in dieser App und das wird auch so bleiben. Der komplette Quellcode steht unter der GPLv3." "<b>Optimiert für Smartwatches</b> @@ -142,7 +142,7 @@ Erinnerungen können direkt von deiner Android Wear Watch abgehakt, pausiert ode -"Allzeit" +"Jederzeit" "Jeden Tag" "Jede Woche" "2 Mal pro Woche" diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 3c584749f..6470a9b0d 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -38,6 +38,7 @@ + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9d3f32315..04b2c20bc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -202,4 +202,5 @@ By name By color By score + Download \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 867e29ec9..a456262a8 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -53,6 +53,7 @@ @drawable/ic_action_add_dark @drawable/ic_action_archive_dark @drawable/ic_action_edit_dark + @drawable/ic_action_download_dark @drawable/ic_action_unarchive_dark @drawable/ic_action_color_dark @drawable/ic_action_filter_dark diff --git a/app/src/test/java/org/isoron/uhabits/activities/habits/show/ShowHabitsMenuTest.java b/app/src/test/java/org/isoron/uhabits/activities/habits/show/ShowHabitsMenuTest.java new file mode 100644 index 000000000..4a4722208 --- /dev/null +++ b/app/src/test/java/org/isoron/uhabits/activities/habits/show/ShowHabitsMenuTest.java @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2016 Álinson Santos Xavier + * + * This file is part of Loop Habit Tracker. + * + * Loop Habit Tracker is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * Loop Habit Tracker is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +package org.isoron.uhabits.activities.habits.show; + +import android.view.*; + +import org.isoron.uhabits.*; +import org.isoron.uhabits.models.*; +import org.isoron.uhabits.tasks.*; +import org.junit.*; + +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.*; + +public class ShowHabitsMenuTest extends BaseUnitTest +{ + private ShowHabitActivity activity; + + private ShowHabitScreen screen; + + private ShowHabitsMenu menu; + + private Habit habit; + + private ExportCSVTaskFactory exportCSVFactory; + + private TaskRunner taskRunner; + + private ExportCSVTask task; + + @Override + public void setUp() + { + super.setUp(); + activity = mock(ShowHabitActivity.class); + screen = mock(ShowHabitScreen.class); + habit = mock(Habit.class); + exportCSVFactory = mock(ExportCSVTaskFactory.class); + taskRunner = mock(TaskRunner.class); + menu = new ShowHabitsMenu(activity, screen, habit, exportCSVFactory, + taskRunner); + } + + @Test + public void testOnDownloadHabit() + { + onItemSelected(R.id.download); + verify(taskRunner).execute(any()); + } + + @Test + public void testOnEditHabit() + { + onItemSelected(R.id.action_edit_habit); + verify(screen).showEditHabitDialog(); + } + + protected void onItemSelected(int actionId) + { + MenuItem item = mock(MenuItem.class); + when(item.getItemId()).thenReturn(actionId); + menu.onItemSelected(item); + } +} \ No newline at end of file