From fa4944700c80b6bd70caab612ec3c9dfa41e9982 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Fri, 26 May 2017 15:48:18 -0400 Subject: [PATCH] Move UI behavior to uhabits-core --- .../org/isoron/uhabits/BaseAndroidTest.java | 2 +- .../habits/list/ListHabitsControllerTest.java | 4 +- .../habits/list/ListHabitsMenuTest.java | 4 +- .../habits/list/ListHabitsScreenTest.java | 4 +- .../CheckmarkButtonControllerTest.java | 4 +- .../habits/list/views/HeaderViewTest.java | 4 +- .../habits/show/ShowHabitsMenuTest.java | 83 ---------------- .../receivers/ReminderControllerTest.java | 4 +- .../androidbase/activities/BaseRootView.java | 20 +++- .../java/org/isoron/uhabits/AppComponent.java | 2 +- .../org/isoron/uhabits/HabitsApplication.java | 2 +- .../uhabits/activities/ThemeSwitcher.java | 4 +- .../activities/about/AboutActivity.java | 10 +- .../activities/about/AboutRootView.java | 69 +++---------- .../uhabits/activities/about/AboutScreen.java | 73 ++++++++++++++ .../habits/edit/EditHabitDialog.java | 2 +- .../habits/list/ListHabitsActivity.java | 2 +- .../habits/list/ListHabitsController.java | 4 +- .../habits/list/ListHabitsMenu.java | 4 +- .../habits/list/ListHabitsScreen.java | 4 +- .../CheckmarkButtonController.java | 4 +- .../controllers/NumberButtonController.java | 4 +- .../list/model/HabitCardListAdapter.java | 4 +- .../habits/list/model/HintList.java | 4 +- .../habits/list/views/CheckmarkPanelView.java | 4 +- .../habits/list/views/HeaderView.java | 7 +- .../habits/list/views/NumberPanelView.java | 4 +- .../habits/show/ShowHabitActivity.java | 44 +++++++-- .../habits/show/ShowHabitComponent.java | 8 +- .../habits/show/ShowHabitController.java | 33 +++---- .../habits/show/ShowHabitModule.java | 27 ++++- .../habits/show/ShowHabitRootView.java | 29 +----- .../habits/show/ShowHabitScreen.java | 43 +++++--- .../habits/show/ShowHabitsMenu.java | 50 ++-------- .../habits/show/views/ScoreCard.java | 2 +- .../activities/settings/SettingsFragment.java | 2 +- .../notifications/NotificationTray.java | 6 +- ...eferences.java => AndroidPreferences.java} | 47 ++++----- .../uhabits/receivers/PebbleReceiver.java | 2 +- .../uhabits/receivers/ReminderController.java | 4 +- .../uhabits/receivers/WidgetReceiver.java | 2 +- .../org/isoron/uhabits/sync/SyncManager.java | 4 +- .../org/isoron/uhabits/sync/SyncService.java | 4 +- .../isoron/uhabits/widgets/ScoreWidget.java | 2 +- uhabits-core/build.gradle | 1 + .../uhabits/preferences/Preferences.java | 26 +++++ .../uhabits/ui/about/AboutBehavior.java | 90 +++++++++++++++++ .../ui/habits/show/ShowHabitBehavior.java | 65 ++++++++++++ .../ui/habits/show/ShowHabitMenuBehavior.java | 98 +++++++++++++++++++ .../java/org/isoron/uhabits/BaseUnitTest.java | 4 + .../show/ShowHabitMenuBehaviorTest.java | 72 ++++++++++++++ 51 files changed, 662 insertions(+), 339 deletions(-) delete mode 100644 uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/ShowHabitsMenuTest.java create mode 100644 uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutScreen.java rename uhabits-android/src/main/java/org/isoron/uhabits/preferences/{Preferences.java => AndroidPreferences.java} (97%) create mode 100644 uhabits-core/src/main/java/org/isoron/uhabits/preferences/Preferences.java create mode 100644 uhabits-core/src/main/java/org/isoron/uhabits/ui/about/AboutBehavior.java create mode 100644 uhabits-core/src/main/java/org/isoron/uhabits/ui/habits/show/ShowHabitBehavior.java create mode 100644 uhabits-core/src/main/java/org/isoron/uhabits/ui/habits/show/ShowHabitMenuBehavior.java create mode 100644 uhabits-core/src/test/java/org/isoron/uhabits/ui/habits/show/ShowHabitMenuBehaviorTest.java diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.java index 573db0d54..9ea0dec04 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.java @@ -51,7 +51,7 @@ public class BaseAndroidTest extends TestCase protected Context targetContext; - protected Preferences prefs; + protected AndroidPreferences prefs; protected HabitList habitList; diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/ListHabitsControllerTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/ListHabitsControllerTest.java index 1b51941fe..ee469da95 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/ListHabitsControllerTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/ListHabitsControllerTest.java @@ -47,7 +47,7 @@ public class ListHabitsControllerTest extends BaseAndroidTest private ListHabitsScreen screen; - private Preferences prefs; + private AndroidPreferences prefs; private ReminderScheduler reminderScheduler; @@ -69,7 +69,7 @@ public class ListHabitsControllerTest extends BaseAndroidTest commandRunner = mock(CommandRunner.class); adapter = mock(HabitCardListAdapter.class); screen = mock(ListHabitsScreen.class); - prefs = mock(Preferences.class); + prefs = mock(AndroidPreferences.class); reminderScheduler = mock(ReminderScheduler.class); taskRunner = new SingleThreadTaskRunner(); widgetUpdater = mock(WidgetUpdater.class); diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenuTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenuTest.java index e7648b0c2..a831cdfe9 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenuTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenuTest.java @@ -40,7 +40,7 @@ public class ListHabitsMenuTest extends BaseAndroidTest private HabitCardListAdapter adapter; - private Preferences preferences; + private AndroidPreferences preferences; private ThemeSwitcher themeSwitcher; @@ -56,7 +56,7 @@ public class ListHabitsMenuTest extends BaseAndroidTest activity = mock(BaseActivity.class); screen = mock(ListHabitsScreen.class); adapter = mock(HabitCardListAdapter.class); - preferences = mock(Preferences.class); + preferences = mock(AndroidPreferences.class); themeSwitcher = mock(ThemeSwitcher.class); when(preferences.getShowArchived()).thenReturn(false); diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreenTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreenTest.java index 6692aad5a..b8aec240a 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreenTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreenTest.java @@ -66,7 +66,7 @@ public class ListHabitsScreenTest extends BaseAndroidTest private ThemeSwitcher themeSwitcher; - private Preferences prefs; + private AndroidPreferences prefs; private CommandParser commandParser; @@ -84,7 +84,7 @@ public class ListHabitsScreenTest extends BaseAndroidTest confirmDeleteDialogFactory = mock(ConfirmDeleteDialogFactory.class); colorPickerDialogFactory = mock(ColorPickerDialogFactory.class); dialogFactory = mock(EditHabitDialogFactory.class); - prefs = mock(Preferences.class); + prefs = mock(AndroidPreferences.class); commandParser = mock(CommandParser.class); screen = spy(new ListHabitsScreen(activity, commandRunner, rootView, diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/controllers/CheckmarkButtonControllerTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/controllers/CheckmarkButtonControllerTest.java index 2c01d26fb..be4ddb02e 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/controllers/CheckmarkButtonControllerTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/controllers/CheckmarkButtonControllerTest.java @@ -39,7 +39,7 @@ public class CheckmarkButtonControllerTest extends BaseAndroidTest private int timestamp; - private Preferences prefs; + private AndroidPreferences prefs; @Override @Before @@ -49,7 +49,7 @@ public class CheckmarkButtonControllerTest extends BaseAndroidTest timestamp = 0; habit = mock(Habit.class); - prefs = mock(Preferences.class); + prefs = mock(AndroidPreferences.class); this.view = mock(CheckmarkButtonView.class); this.listener = mock(CheckmarkButtonController.Listener.class); diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HeaderViewTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HeaderViewTest.java index d60299766..1147748d9 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HeaderViewTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HeaderViewTest.java @@ -41,7 +41,7 @@ public class HeaderViewTest extends BaseViewTest private HeaderView view; - private Preferences prefs; + private AndroidPreferences prefs; private MidnightTimer midnightTimer; @@ -50,7 +50,7 @@ public class HeaderViewTest extends BaseViewTest public void setUp() { super.setUp(); - prefs = mock(Preferences.class); + prefs = mock(AndroidPreferences.class); midnightTimer = mock(MidnightTimer.class); view = new HeaderView(targetContext, prefs, midnightTimer); view.setButtonCount(5); diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/ShowHabitsMenuTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/ShowHabitsMenuTest.java deleted file mode 100644 index dd244a736..000000000 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/ShowHabitsMenuTest.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 2017 Á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.androidbase.*; -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 BaseAndroidTest -{ - private ShowHabitActivity activity; - - private ShowHabitScreen screen; - - private ShowHabitsMenu menu; - - private Habit habit; - - private ExportCSVTaskFactory exportCSVFactory; - - private TaskRunner taskRunner; - - private BaseSystem system; - - @Override - public void setUp() - { - super.setUp(); - activity = mock(ShowHabitActivity.class); - system = mock(BaseSystem.class); - screen = mock(ShowHabitScreen.class); - habit = mock(Habit.class); - exportCSVFactory = mock(ExportCSVTaskFactory.class); - taskRunner = mock(TaskRunner.class); - menu = new ShowHabitsMenu(activity, system, screen, habit, - exportCSVFactory, taskRunner); - } - - @Test - public void testOnDownloadHabit() - { - onItemSelected(R.id.export); - 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 diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/receivers/ReminderControllerTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/receivers/ReminderControllerTest.java index f7d046a18..92e0da412 100644 --- a/uhabits-android/src/androidTest/java/org/isoron/uhabits/receivers/ReminderControllerTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/receivers/ReminderControllerTest.java @@ -37,7 +37,7 @@ public class ReminderControllerTest extends BaseAndroidTest private NotificationTray notificationTray; - private Preferences preferences; + private AndroidPreferences preferences; @Override public void setUp() @@ -46,7 +46,7 @@ public class ReminderControllerTest extends BaseAndroidTest reminderScheduler = mock(ReminderScheduler.class); notificationTray = mock(NotificationTray.class); - preferences = mock(Preferences.class); + preferences = mock(AndroidPreferences.class); controller = new ReminderController(reminderScheduler, notificationTray, preferences); diff --git a/uhabits-android/src/main/java/org/isoron/androidbase/activities/BaseRootView.java b/uhabits-android/src/main/java/org/isoron/androidbase/activities/BaseRootView.java index 38238a6f5..ba5ed7649 100644 --- a/uhabits-android/src/main/java/org/isoron/androidbase/activities/BaseRootView.java +++ b/uhabits-android/src/main/java/org/isoron/androidbase/activities/BaseRootView.java @@ -48,6 +48,8 @@ public abstract class BaseRootView extends FrameLayout private final ThemeSwitcher themeSwitcher; + boolean shouldDisplayHomeAsUp = false; + public BaseRootView(@NonNull Context context) { super(context); @@ -58,11 +60,23 @@ public abstract class BaseRootView extends FrameLayout public boolean getDisplayHomeAsUp() { - return false; + return shouldDisplayHomeAsUp; + } + + public void setDisplayHomeAsUp(boolean b) + { + shouldDisplayHomeAsUp = b; } @NonNull - public abstract Toolbar getToolbar(); + public Toolbar getToolbar() + { + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + if (toolbar == null) throw new RuntimeException( + "Your BaseRootView should have a " + + "toolbar with id R.id.toolbar"); + return toolbar; + } public int getToolbarColor() { @@ -86,7 +100,7 @@ public abstract class BaseRootView extends FrameLayout if (view != null) view.setVisibility(GONE); view = findViewById(R.id.headerShadow); - if(view != null) view.setVisibility(GONE); + if (view != null) view.setVisibility(GONE); } } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/AppComponent.java b/uhabits-android/src/main/java/org/isoron/uhabits/AppComponent.java index 90a1861b9..82007c403 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/AppComponent.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/AppComponent.java @@ -73,7 +73,7 @@ public interface AppComponent PendingIntentFactory getPendingIntentFactory(); - Preferences getPreferences(); + AndroidPreferences getPreferences(); ReminderScheduler getReminderScheduler(); diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/HabitsApplication.java b/uhabits-android/src/main/java/org/isoron/uhabits/HabitsApplication.java index 2e298ce9e..19184b300 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/HabitsApplication.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/HabitsApplication.java @@ -109,7 +109,7 @@ public class HabitsApplication extends Application notificationTray = component.getNotificationTray(); notificationTray.startListening(); - Preferences prefs = component.getPreferences(); + AndroidPreferences prefs = component.getPreferences(); prefs.initialize(); prefs.updateLastAppVersion(); diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/ThemeSwitcher.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/ThemeSwitcher.java index 6a92b421d..b7b4bac9c 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/ThemeSwitcher.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/ThemeSwitcher.java @@ -37,11 +37,11 @@ public class ThemeSwitcher @NonNull private final BaseActivity activity; - private Preferences preferences; + private AndroidPreferences preferences; @Inject public ThemeSwitcher(@NonNull BaseActivity activity, - @NonNull Preferences preferences) + @NonNull AndroidPreferences preferences) { this.activity = activity; this.preferences = preferences; diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutActivity.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutActivity.java index 543f032c6..7af5e7025 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutActivity.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutActivity.java @@ -22,7 +22,8 @@ package org.isoron.uhabits.activities.about; import android.os.*; import org.isoron.androidbase.activities.*; -import org.isoron.uhabits.intents.*; +import org.isoron.uhabits.*; +import org.isoron.uhabits.ui.about.*; /** * Activity that allows the user to see information about the app itself. @@ -34,8 +35,11 @@ public class AboutActivity extends BaseActivity protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - AboutRootView rootView = new AboutRootView(this, new IntentFactory()); - BaseScreen screen = new BaseScreen(this); + HabitsApplication app = (HabitsApplication) getApplication(); + AppComponent cmp = app.getComponent(); + AboutScreen screen = new AboutScreen(this, cmp.getIntentFactory()); + AboutBehavior behavior = new AboutBehavior(cmp.getPreferences(), screen); + AboutRootView rootView = new AboutRootView(this, behavior); screen.setRootView(rootView); setScreen(screen); } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutRootView.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutRootView.java index 4d03b5313..489fef7b7 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutRootView.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutRootView.java @@ -21,15 +21,12 @@ package org.isoron.uhabits.activities.about; import android.content.*; import android.support.annotation.*; -import android.support.v7.widget.Toolbar; import android.widget.*; import org.isoron.androidbase.activities.*; import org.isoron.uhabits.BuildConfig; -import org.isoron.uhabits.*; import org.isoron.uhabits.R; -import org.isoron.uhabits.intents.*; -import org.isoron.uhabits.preferences.*; +import org.isoron.uhabits.ui.about.*; import org.isoron.uhabits.utils.*; import butterknife.*; @@ -48,47 +45,22 @@ public class AboutRootView extends BaseRootView @BindView(R.id.tvSource) TextView tvSource; - @BindView(R.id.toolbar) - Toolbar toolbar; - - int developerCountdown = 10; - - @Nullable - Preferences prefs; - - private final IntentFactory intents; + @NonNull + private final AboutBehavior behavior; - public AboutRootView(Context context, IntentFactory intents) + public AboutRootView(@NonNull Context context, + @NonNull AboutBehavior behavior) { super(context); - this.intents = intents; + this.behavior = behavior; addView(inflate(getContext(), R.layout.about, null)); ButterKnife.bind(this); - tvVersion.setText( - String.format(getResources().getString(R.string.version_n), - BuildConfig.VERSION_NAME)); + String version = getResources().getString(R.string.version_n); + tvVersion.setText(String.format(version, BuildConfig.VERSION_NAME)); - if (context.getApplicationContext() instanceof HabitsApplication) - { - HabitsApplication app = - (HabitsApplication) context.getApplicationContext(); - prefs = app.getComponent().getPreferences(); - } - } - - @Override - public boolean getDisplayHomeAsUp() - { - return true; - } - - @NonNull - @Override - public Toolbar getToolbar() - { - return toolbar; + setDisplayHomeAsUp(true); } @Override @@ -104,48 +76,37 @@ public class AboutRootView extends BaseRootView @OnClick(R.id.tvFeedback) public void onClickFeedback() { - Intent intent = intents.sendFeedback(getContext()); - getContext().startActivity(intent); + behavior.onSendFeedback(); } @OnClick(R.id.tvVersion) public void onClickIcon() { - developerCountdown--; - if (developerCountdown <= 0) - { - if (prefs == null) return; - prefs.setDeveloper(true); - String text = "You are now a developer"; - Toast.makeText(getContext(), text, Toast.LENGTH_LONG).show(); - } + behavior.onPressDeveloperCountdown(); } @OnClick(R.id.tvRate) public void onClickRate() { - Intent intent = intents.rateApp(getContext()); - getContext().startActivity(intent); + behavior.onRateApp(); } @OnClick(R.id.tvSource) public void onClickSource() { - Intent intent = intents.viewSourceCode(getContext()); - getContext().startActivity(intent); + behavior.onViewSourceCode(); } @OnClick(R.id.tvTranslate) public void onClickTranslate() { - Intent intent = intents.helpTranslate(getContext()); - getContext().startActivity(intent); + behavior.onTranslateApp(); } @Override protected void initToolbar() { super.initToolbar(); - toolbar.setTitle(getResources().getString(R.string.about)); + getToolbar().setTitle(getResources().getString(R.string.about)); } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutScreen.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutScreen.java new file mode 100644 index 000000000..46698ac20 --- /dev/null +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutScreen.java @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2017 Á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.about; + +import android.support.annotation.*; +import android.widget.*; + +import org.isoron.androidbase.activities.*; +import org.isoron.uhabits.intents.*; +import org.isoron.uhabits.ui.about.*; + +import javax.inject.*; + +public class AboutScreen extends BaseScreen implements AboutBehavior.Screen +{ + @NonNull + private final IntentFactory intents; + + @Inject + public AboutScreen(@NonNull BaseActivity activity, + @NonNull IntentFactory intents) + { + super(activity); + this.intents = intents; + } + + @Override + public void showMessage(AboutBehavior.Message message) + { + Toast.makeText(activity, "OK", Toast.LENGTH_LONG).show(); + } + + @Override + public void showRateAppWebsite() + { + activity.startActivity(intents.rateApp(activity)); + } + + @Override + public void showSendFeedbackScreen() + { + activity.startActivity(intents.sendFeedback(activity)); + } + + @Override + public void showSourceCodeWebsite() + { + activity.startActivity(intents.viewSourceCode(activity)); + } + + @Override + public void showTranslationWebsite() + { + activity.startActivity(intents.helpTranslate(activity)); + } +} diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java index c2bad78f4..56ade45da 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java @@ -49,7 +49,7 @@ public class EditHabitDialog extends AppCompatDialogFragment protected Habit originalHabit; - protected Preferences prefs; + protected AndroidPreferences prefs; protected CommandRunner commandRunner; diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.java index 57d694561..8953c49a9 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.java @@ -45,7 +45,7 @@ public class ListHabitsActivity extends BaseActivity private boolean pureBlack; - private Preferences prefs; + private AndroidPreferences prefs; private MidnightTimer midnightTimer; diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsController.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsController.java index 58160bb68..81aadca72 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsController.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsController.java @@ -57,7 +57,7 @@ public class ListHabitsController private final HabitCardListAdapter adapter; @NonNull - private final Preferences prefs; + private final AndroidPreferences prefs; @NonNull private final CommandRunner commandRunner; @@ -81,7 +81,7 @@ public class ListHabitsController @NonNull HabitList habitList, @NonNull HabitCardListAdapter adapter, @NonNull ListHabitsScreen screen, - @NonNull Preferences prefs, + @NonNull AndroidPreferences prefs, @NonNull ReminderScheduler reminderScheduler, @NonNull TaskRunner taskRunner, @NonNull WidgetUpdater widgetUpdater, diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.java index 68b8ae69b..b4c601293 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.java @@ -43,7 +43,7 @@ public class ListHabitsMenu extends BaseMenu private boolean showCompleted; - private final Preferences preferences; + private final AndroidPreferences preferences; private ThemeSwitcher themeSwitcher; @@ -51,7 +51,7 @@ public class ListHabitsMenu extends BaseMenu public ListHabitsMenu(@NonNull BaseActivity activity, @NonNull ListHabitsScreen screen, @NonNull HabitCardListAdapter adapter, - @NonNull Preferences preferences, + @NonNull AndroidPreferences preferences, @NonNull ThemeSwitcher themeSwitcher) { super(activity); diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.java index 6297a37d2..9563eadf2 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.java @@ -89,7 +89,7 @@ public class ListHabitsScreen extends BaseScreen private final ThemeSwitcher themeSwitcher; @NonNull - private Preferences prefs; + private AndroidPreferences prefs; @NonNull private final CommandParser commandParser; @@ -103,7 +103,7 @@ public class ListHabitsScreen extends BaseScreen @NonNull ConfirmDeleteDialogFactory confirmDeleteDialogFactory, @NonNull ColorPickerDialogFactory colorPickerFactory, @NonNull EditHabitDialogFactory editHabitDialogFactory, - @NonNull Preferences prefs, + @NonNull AndroidPreferences prefs, @NonNull CommandParser commandParser) { super(activity); diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/controllers/CheckmarkButtonController.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/controllers/CheckmarkButtonController.java index 382e12cda..b8b7e04a4 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/controllers/CheckmarkButtonController.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/controllers/CheckmarkButtonController.java @@ -37,14 +37,14 @@ public class CheckmarkButtonController private Listener listener; @NonNull - private final Preferences prefs; + private final AndroidPreferences prefs; @NonNull private Habit habit; private long timestamp; - public CheckmarkButtonController(@Provided @NonNull Preferences prefs, + public CheckmarkButtonController(@Provided @NonNull AndroidPreferences prefs, @NonNull Habit habit, long timestamp) { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/controllers/NumberButtonController.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/controllers/NumberButtonController.java index 0cd31fe20..0198625d3 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/controllers/NumberButtonController.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/controllers/NumberButtonController.java @@ -37,14 +37,14 @@ public class NumberButtonController private Listener listener; @NonNull - private final Preferences prefs; + private final AndroidPreferences prefs; @NonNull private Habit habit; private long timestamp; - public NumberButtonController(@Provided @NonNull Preferences prefs, + public NumberButtonController(@Provided @NonNull AndroidPreferences prefs, @NonNull Habit habit, long timestamp) { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/model/HabitCardListAdapter.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/model/HabitCardListAdapter.java index 4367bbb23..7fbe0a9b1 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/model/HabitCardListAdapter.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/model/HabitCardListAdapter.java @@ -58,13 +58,13 @@ public class HabitCardListAdapter private final HabitCardListCache cache; @NonNull - private Preferences preferences; + private AndroidPreferences preferences; private final MidnightTimer midnightTimer; @Inject public HabitCardListAdapter(@NonNull HabitCardListCache cache, - @NonNull Preferences preferences, + @NonNull AndroidPreferences preferences, @NonNull MidnightTimer midnightTimer) { this.preferences = preferences; diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/model/HintList.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/model/HintList.java index 8fa0d6274..c2f2967eb 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/model/HintList.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/model/HintList.java @@ -33,7 +33,7 @@ import org.isoron.uhabits.utils.*; @AutoFactory public class HintList { - private final Preferences prefs; + private final AndroidPreferences prefs; @NonNull private final String[] hints; @@ -43,7 +43,7 @@ public class HintList * * @param hints initial list of hints */ - public HintList(@Provided @NonNull Preferences prefs, + public HintList(@Provided @NonNull AndroidPreferences prefs, @NonNull String hints[]) { this.prefs = prefs; diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelView.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelView.java index c61c378ce..16cc528e2 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelView.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelView.java @@ -39,14 +39,14 @@ import static org.isoron.uhabits.utils.ColorUtils.*; import static org.isoron.uhabits.utils.InterfaceUtils.getDimension; public class CheckmarkPanelView extends LinearLayout - implements Preferences.Listener + implements AndroidPreferences.Listener { private static final int LEFT_TO_RIGHT = 0; private static final int RIGHT_TO_LEFT = 1; @Nullable - private Preferences prefs; + private AndroidPreferences prefs; private int values[]; diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HeaderView.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HeaderView.java index 761301d39..733e8fd64 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HeaderView.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HeaderView.java @@ -27,7 +27,6 @@ import android.util.*; import org.isoron.uhabits.*; import org.isoron.uhabits.activities.common.views.*; -import org.isoron.uhabits.activities.habits.list.*; import org.isoron.uhabits.preferences.*; import org.isoron.uhabits.utils.*; @@ -36,13 +35,13 @@ import java.util.*; import static org.isoron.uhabits.utils.InterfaceUtils.*; public class HeaderView extends ScrollableChart - implements Preferences.Listener, MidnightTimer.MidnightListener + implements AndroidPreferences.Listener, MidnightTimer.MidnightListener { private int buttonCount; @Nullable - private Preferences prefs; + private AndroidPreferences prefs; @Nullable private MidnightTimer midnightTimer; @@ -52,7 +51,7 @@ public class HeaderView extends ScrollableChart private RectF rect; public HeaderView(@NonNull Context context, - @NonNull Preferences prefs, + @NonNull AndroidPreferences prefs, @NonNull MidnightTimer midnightTimer) { super(context); diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelView.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelView.java index 1397d0446..3bbcf95f3 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelView.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelView.java @@ -39,14 +39,14 @@ import static org.isoron.uhabits.utils.ColorUtils.*; import static org.isoron.uhabits.utils.InterfaceUtils.*; public class NumberPanelView extends LinearLayout - implements Preferences.Listener + implements AndroidPreferences.Listener { private static final int LEFT_TO_RIGHT = 0; private static final int RIGHT_TO_LEFT = 1; @Nullable - private Preferences prefs; + private AndroidPreferences prefs; private double values[]; diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.java index 611b979b5..0a914d873 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.java @@ -27,6 +27,9 @@ import android.support.annotation.*; import org.isoron.androidbase.activities.*; import org.isoron.uhabits.*; import org.isoron.uhabits.models.*; +import org.isoron.uhabits.ui.habits.show.*; + +import java.io.*; /** * Activity that allows the user to see more information about a single habit. @@ -34,8 +37,24 @@ import org.isoron.uhabits.models.*; * Shows all the metadata for the habit, in addition to several charts. */ public class ShowHabitActivity extends BaseActivity + implements ShowHabitMenuBehavior.System { - private HabitList habits; + @Nullable + private HabitList habitList; + + @Nullable + private AppComponent appComponent; + + @Nullable + private ShowHabitScreen screen; + + @Override + public File getCSVOutputDir() + { + if(appComponent == null) throw new IllegalStateException(); + + return appComponent.getBaseSystem().getFilesDir("CSV"); + } @Override protected void onCreate(Bundle savedInstanceState) @@ -43,7 +62,8 @@ public class ShowHabitActivity extends BaseActivity super.onCreate(savedInstanceState); HabitsApplication app = (HabitsApplication) getApplicationContext(); - habits = app.getComponent().getHabitList(); + appComponent = app.getComponent(); + habitList = appComponent.getHabitList(); Habit habit = getHabitFromIntent(); ShowHabitComponent component = DaggerShowHabitComponent @@ -52,22 +72,30 @@ public class ShowHabitActivity extends BaseActivity .showHabitModule(new ShowHabitModule(this, habit)) .build(); - ShowHabitRootView rootView = component.getRootView(); - ShowHabitScreen screen = component.getScreen(); - - setScreen(screen); + screen = component.getScreen(); screen.setMenu(component.getMenu()); screen.setController(component.getController()); - rootView.setController(component.getController()); + component.getRootView().setController(component.getController()); + setScreen(screen); + } + + @Override + protected void onResume() + { + if(screen == null) throw new IllegalStateException(); + + super.onResume(); screen.reattachDialogs(); } @NonNull private Habit getHabitFromIntent() { + if(habitList == null) throw new IllegalStateException(); + Uri data = getIntent().getData(); - Habit habit = habits.getById(ContentUris.parseId(data)); + Habit habit = habitList.getById(ContentUris.parseId(data)); if (habit == null) throw new RuntimeException("habit not found"); return habit; } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitComponent.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitComponent.java index 497ea8f61..3bfc99c54 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitComponent.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitComponent.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016 Álinson Santos Xavier + * Copyright (C) 2017 Álinson Santos Xavier * * This file is part of Loop Habit Tracker. * @@ -19,6 +19,8 @@ package org.isoron.uhabits.activities.habits.show; +import android.support.annotation.*; + import org.isoron.androidbase.activities.*; import org.isoron.uhabits.*; @@ -29,11 +31,15 @@ import dagger.*; dependencies = { AppComponent.class }) public interface ShowHabitComponent { + @NonNull ShowHabitController getController(); + @NonNull ShowHabitsMenu getMenu(); + @NonNull ShowHabitRootView getRootView(); + @NonNull ShowHabitScreen getScreen(); } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitController.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitController.java index 960e5abfb..7de9f0080 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitController.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitController.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016 Álinson Santos Xavier + * Copyright (C) 2017 Álinson Santos Xavier * * This file is part of Loop Habit Tracker. * @@ -21,50 +21,39 @@ package org.isoron.uhabits.activities.habits.show; import android.support.annotation.*; -import org.isoron.androidbase.activities.*; import org.isoron.uhabits.activities.common.dialogs.*; -import org.isoron.uhabits.commands.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.activities.habits.show.views.*; +import org.isoron.uhabits.ui.habits.show.*; import javax.inject.*; -@ActivityScope public class ShowHabitController - implements ShowHabitRootView.Controller, HistoryEditorDialog.Controller + implements HistoryCard.Controller, HistoryEditorDialog.Controller { - @NonNull - private final ShowHabitScreen screen; + private ShowHabitBehavior behavior; - @NonNull - private final Habit habit; - - @NonNull - private final CommandRunner commandRunner; + private ShowHabitScreen screen; @Inject - public ShowHabitController(@NonNull ShowHabitScreen screen, - @NonNull CommandRunner commandRunner, - @NonNull Habit habit) + public ShowHabitController(@NonNull ShowHabitBehavior behavior, + @NonNull ShowHabitScreen screen) { + this.behavior = behavior; this.screen = screen; - this.habit = habit; - this.commandRunner = commandRunner; } @Override public void onEditHistoryButtonClick() { - screen.showEditHistoryDialog(); + behavior.onEditHistory(); } @Override public void onToggleCheckmark(long timestamp) { - commandRunner.execute(new ToggleRepetitionCommand(habit, timestamp), - null); + behavior.onToggleCheckmark(timestamp); } - @Override public void onToolbarChanged() { screen.invalidateToolbar(); diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitModule.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitModule.java index 92f29ecaf..3c683baac 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitModule.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitModule.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016 Álinson Santos Xavier + * Copyright (C) 2017 Álinson Santos Xavier * * This file is part of Loop Habit Tracker. * @@ -19,17 +19,20 @@ package org.isoron.uhabits.activities.habits.show; +import android.support.annotation.*; + import org.isoron.androidbase.activities.*; import org.isoron.uhabits.models.*; +import org.isoron.uhabits.ui.habits.show.*; import dagger.*; @Module public class ShowHabitModule extends ActivityModule { - private final Habit habit; + private Habit habit; - public ShowHabitModule(BaseActivity activity, Habit habit) + public ShowHabitModule(@NonNull BaseActivity activity, @NonNull Habit habit) { super(activity); this.habit = habit; @@ -40,4 +43,22 @@ public class ShowHabitModule extends ActivityModule { return habit; } + + @Provides + public ShowHabitBehavior.Screen getScreen(ShowHabitScreen screen) + { + return screen; + } + + @Provides + public ShowHabitMenuBehavior.Screen getMenuScreen(ShowHabitScreen screen) + { + return screen; + } + + @Provides + public ShowHabitMenuBehavior.System getSystem(BaseActivity activity) + { + return (ShowHabitActivity) activity; + } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitRootView.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitRootView.java index 42f888014..986c4c9a8 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitRootView.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitRootView.java @@ -65,8 +65,8 @@ public class ShowHabitRootView extends BaseRootView @BindView(R.id.toolbar) Toolbar toolbar; - @NonNull - private Controller controller; + @Nullable + private ShowHabitController controller; @Inject public ShowHabitRootView(@NonNull @ActivityContext Context context, @@ -78,25 +78,11 @@ public class ShowHabitRootView extends BaseRootView addView(inflate(getContext(), R.layout.show_habit, null)); ButterKnife.bind(this); - controller = new Controller() {}; - + setDisplayHomeAsUp(true); initCards(); initToolbar(); } - @Override - public boolean getDisplayHomeAsUp() - { - return true; - } - - @NonNull - @Override - public Toolbar getToolbar() - { - return toolbar; - } - @Override public int getToolbarColor() { @@ -114,10 +100,10 @@ public class ShowHabitRootView extends BaseRootView toolbar.setTitle(habit.getName()); }); - controller.onToolbarChanged(); + if(controller != null) controller.onToolbarChanged(); } - public void setController(@NonNull Controller controller) + public void setController(@NonNull ShowHabitController controller) { this.controller = controller; historyCard.setController(controller); @@ -158,9 +144,4 @@ public class ShowHabitRootView extends BaseRootView else barCard.setVisibility(GONE); } - - public interface Controller extends HistoryCard.Controller - { - default void onToolbarChanged() {} - } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitScreen.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitScreen.java index d1f680c52..813b5d21e 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitScreen.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitScreen.java @@ -22,14 +22,17 @@ package org.isoron.uhabits.activities.habits.show; import android.support.annotation.*; import org.isoron.androidbase.activities.*; +import org.isoron.uhabits.*; import org.isoron.uhabits.activities.common.dialogs.*; import org.isoron.uhabits.activities.habits.edit.*; import org.isoron.uhabits.models.*; +import org.isoron.uhabits.ui.habits.show.*; import javax.inject.*; @ActivityScope public class ShowHabitScreen extends BaseScreen + implements ShowHabitMenuBehavior.Screen, ShowHabitBehavior.Screen { @NonNull private final Habit habit; @@ -44,8 +47,7 @@ public class ShowHabitScreen extends BaseScreen public ShowHabitScreen(@NonNull BaseActivity activity, @NonNull Habit habit, @NonNull ShowHabitRootView view, - @NonNull - EditHabitDialogFactory editHabitDialogFactory) + @NonNull EditHabitDialogFactory editHabitDialogFactory) { super(activity); setRootView(view); @@ -53,37 +55,46 @@ public class ShowHabitScreen extends BaseScreen this.habit = habit; } - public void setController(@NonNull ShowHabitController controller) - { - this.controller = controller; - } - public void reattachDialogs() { - if(controller == null) throw new IllegalStateException(); + if (controller == null) throw new IllegalStateException(); HistoryEditorDialog historyEditor = (HistoryEditorDialog) activity .getSupportFragmentManager() .findFragmentByTag("historyEditor"); - if (historyEditor != null) - historyEditor.setController(controller); + if (historyEditor != null) historyEditor.setController(controller); } - public void showEditHabitDialog() + public void setController(@NonNull ShowHabitController controller) { - activity.showDialog( - editHabitDialogFactory.edit(habit), - "editHabit"); + this.controller = controller; } - public void showEditHistoryDialog() + @Override + public void showEditHabitScreen(@NonNull Habit habit) { - if(controller == null) throw new IllegalStateException(); + activity.showDialog(editHabitDialogFactory.edit(habit), "editHabit"); + } + + @Override + public void showEditHistoryScreen() + { + if (controller == null) throw new IllegalStateException(); HistoryEditorDialog dialog = new HistoryEditorDialog(); dialog.setHabit(habit); dialog.setController(controller); dialog.show(activity.getSupportFragmentManager(), "historyEditor"); } + + @Override + public void showMessage(ShowHabitMenuBehavior.Message m) + { + switch (m) + { + case COULD_NOT_EXPORT: + showMessage(R.string.could_not_export); + } + } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitsMenu.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitsMenu.java index 352b9b7b4..ca0792f41 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitsMenu.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitsMenu.java @@ -22,14 +22,9 @@ package org.isoron.uhabits.activities.habits.show; import android.support.annotation.*; import android.view.*; -import org.isoron.androidbase.*; import org.isoron.androidbase.activities.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.tasks.*; - -import java.io.*; -import java.util.*; +import org.isoron.uhabits.ui.habits.show.*; import javax.inject.*; @@ -37,47 +32,14 @@ import javax.inject.*; public class ShowHabitsMenu extends BaseMenu { @NonNull - private final BaseSystem system; - - @NonNull - private final ShowHabitScreen screen; - - @NonNull - private final Habit habit; - - @NonNull - private final TaskRunner taskRunner; - - @NonNull - private ExportCSVTaskFactory exportCSVFactory; + ShowHabitMenuBehavior behavior; @Inject public ShowHabitsMenu(@NonNull BaseActivity activity, - @NonNull BaseSystem system, - @NonNull ShowHabitScreen screen, - @NonNull Habit habit, - @NonNull ExportCSVTaskFactory exportCSVFactory, - @NonNull TaskRunner taskRunner) + @NonNull ShowHabitMenuBehavior behavior) { super(activity); - this.system = system; - this.screen = screen; - this.habit = habit; - this.taskRunner = taskRunner; - this.exportCSVFactory = exportCSVFactory; - } - - public void exportHabit() - { - List selected = new LinkedList<>(); - selected.add(habit); - File outputDir = system.getFilesDir("CSV"); - ExportCSVTask task = exportCSVFactory.create(selected, - outputDir, filename -> { - if (filename != null) screen.showSendFileScreen(filename); - else screen.showMessage(R.string.could_not_export); - }); - taskRunner.execute(task); + this.behavior = behavior; } @Override @@ -86,11 +48,11 @@ public class ShowHabitsMenu extends BaseMenu switch (item.getItemId()) { case R.id.action_edit_habit: - screen.showEditHabitDialog(); + behavior.onEditHabit(); return true; case R.id.export: - this.exportHabit(); + behavior.onExportCSV(); return true; default: diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/ScoreCard.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/ScoreCard.java index cbb278310..d40c61cd5 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/ScoreCard.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/ScoreCard.java @@ -55,7 +55,7 @@ public class ScoreCard extends HabitCard private TaskRunner taskRunner; @Nullable - private Preferences prefs; + private AndroidPreferences prefs; public ScoreCard(Context context) { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.java index dbd733b62..2cc1cd7d5 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.java @@ -41,7 +41,7 @@ public class SettingsFragment extends PreferenceFragmentCompat private SharedPreferences sharedPrefs; @Nullable - private Preferences prefs; + private AndroidPreferences prefs; @Override public void onActivityResult(int requestCode, int resultCode, Intent data) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/notifications/NotificationTray.java b/uhabits-android/src/main/java/org/isoron/uhabits/notifications/NotificationTray.java index d2b0f7942..2a5db5863 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/notifications/NotificationTray.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/notifications/NotificationTray.java @@ -44,7 +44,7 @@ import static org.isoron.uhabits.notifications.RingtoneManager.*; @AppScope public class NotificationTray - implements CommandRunner.Listener, Preferences.Listener + implements CommandRunner.Listener, AndroidPreferences.Listener { @NonNull private final Context context; @@ -59,7 +59,7 @@ public class NotificationTray private final CommandRunner commandRunner; @NonNull - private final Preferences preferences; + private final AndroidPreferences preferences; @NonNull private final HashMap active; @@ -69,7 +69,7 @@ public class NotificationTray @NonNull TaskRunner taskRunner, @NonNull PendingIntentFactory pendingIntents, @NonNull CommandRunner commandRunner, - @NonNull Preferences preferences) + @NonNull AndroidPreferences preferences) { this.context = context; this.taskRunner = taskRunner; diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/preferences/Preferences.java b/uhabits-android/src/main/java/org/isoron/uhabits/preferences/AndroidPreferences.java similarity index 97% rename from uhabits-android/src/main/java/org/isoron/uhabits/preferences/Preferences.java rename to uhabits-android/src/main/java/org/isoron/uhabits/preferences/AndroidPreferences.java index 33d324851..9231967b4 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/preferences/Preferences.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/preferences/AndroidPreferences.java @@ -32,8 +32,8 @@ import java.util.*; import javax.inject.*; @AppScope -public class Preferences - implements SharedPreferences.OnSharedPreferenceChangeListener +public class AndroidPreferences + implements SharedPreferences.OnSharedPreferenceChangeListener, Preferences { private final Context context; @@ -44,7 +44,7 @@ public class Preferences private LinkedList listeners; @Inject - public Preferences(@AppContext Context context) + public AndroidPreferences(@AppContext Context context) { this.context = context; listeners = new LinkedList<>(); @@ -78,26 +78,6 @@ public class Preferences } } - public String getSyncAddress() - { - return prefs.getString("pref_sync_address", "https://sync.loophabits.org:4000"); - } - - public String getSyncClientId() - { - String id = prefs.getString("pref_sync_client_id", ""); - if(!id.isEmpty()) return id; - - id = UUID.randomUUID().toString(); - prefs.edit().putString("pref_sync_client_id", id).apply(); - return id; - } - - public boolean isSyncFeatureEnabled() - { - return prefs.getBoolean("pref_feature_sync", false); - } - public void setDefaultOrder(HabitList.Order order) { prefs.edit().putString("pref_default_order", order.name()).apply(); @@ -171,6 +151,22 @@ public class Preferences return Long.parseLong(prefs.getString("pref_snooze_interval", "15")); } + public String getSyncAddress() + { + return prefs.getString("pref_sync_address", + "https://sync.loophabits.org:4000"); + } + + public String getSyncClientId() + { + String id = prefs.getString("pref_sync_client_id", ""); + if (!id.isEmpty()) return id; + + id = UUID.randomUUID().toString(); + prefs.edit().putString("pref_sync_client_id", id).apply(); + return id; + } + public String getSyncKey() { return prefs.getString("pref_sync_key", ""); @@ -232,6 +228,11 @@ public class Preferences return prefs.getBoolean("pref_short_toggle", false); } + public boolean isSyncFeatureEnabled() + { + return prefs.getBoolean("pref_feature_sync", false); + } + @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/receivers/PebbleReceiver.java b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/PebbleReceiver.java index 4d10d7ae5..7023a02b3 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/receivers/PebbleReceiver.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/PebbleReceiver.java @@ -53,7 +53,7 @@ public class PebbleReceiver extends PebbleDataReceiver private HabitList filteredHabits; - private Preferences prefs; + private AndroidPreferences prefs; public PebbleReceiver() { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderController.java b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderController.java index 22fd4bcd0..776fc4d85 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderController.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderController.java @@ -37,12 +37,12 @@ public class ReminderController @NonNull private final NotificationTray notificationTray; - private Preferences preferences; + private AndroidPreferences preferences; @Inject public ReminderController(@NonNull ReminderScheduler reminderScheduler, @NonNull NotificationTray notificationTray, - @NonNull Preferences preferences) + @NonNull AndroidPreferences preferences) { this.reminderScheduler = reminderScheduler; this.notificationTray = notificationTray; diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java index e8dd70729..00e55d5aa 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java @@ -61,7 +61,7 @@ public class WidgetReceiver extends BroadcastReceiver IntentParser parser = app.getComponent().getIntentParser(); WidgetController controller = component.getWidgetController(); - Preferences prefs = app.getComponent().getPreferences(); + AndroidPreferences prefs = app.getComponent().getPreferences(); if(prefs.isSyncFeatureEnabled()) context.startService(new Intent(context, SyncService.class)); diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/sync/SyncManager.java b/uhabits-android/src/main/java/org/isoron/uhabits/sync/SyncManager.java index 18449f204..c851df87d 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/sync/SyncManager.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/sync/SyncManager.java @@ -72,7 +72,7 @@ public class SyncManager implements CommandRunner.Listener private boolean readyToEmit = false; @NonNull - private final Preferences prefs; + private final AndroidPreferences prefs; @NonNull private CommandRunner commandRunner; @@ -86,7 +86,7 @@ public class SyncManager implements CommandRunner.Listener @Inject public SyncManager(@NonNull BaseSystem system, - @NonNull Preferences prefs, + @NonNull AndroidPreferences prefs, @NonNull CommandRunner commandRunner, @NonNull CommandParser commandParser) { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/sync/SyncService.java b/uhabits-android/src/main/java/org/isoron/uhabits/sync/SyncService.java index 3f8d59590..e1af21506 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/sync/SyncService.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/sync/SyncService.java @@ -29,11 +29,11 @@ import org.isoron.uhabits.*; import org.isoron.uhabits.preferences.*; import org.isoron.uhabits.receivers.*; -public class SyncService extends Service implements Preferences.Listener +public class SyncService extends Service implements AndroidPreferences.Listener { private SyncManager syncManager; - private Preferences prefs; + private AndroidPreferences prefs; private ConnectivityReceiver connectivityReceiver; diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/widgets/ScoreWidget.java b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/ScoreWidget.java index 7ff8cf1fe..325b3b464 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/widgets/ScoreWidget.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/ScoreWidget.java @@ -39,7 +39,7 @@ public class ScoreWidget extends BaseWidget @NonNull private Habit habit; - private final Preferences prefs; + private final AndroidPreferences prefs; public ScoreWidget(@NonNull Context context, int id, @NonNull Habit habit) { diff --git a/uhabits-core/build.gradle b/uhabits-core/build.gradle index ef7677ada..9cb41dc49 100644 --- a/uhabits-core/build.gradle +++ b/uhabits-core/build.gradle @@ -12,6 +12,7 @@ dependencies { testImplementation 'junit:junit:4+' testImplementation 'org.hamcrest:hamcrest-library:1.4-atlassian-1' + testImplementation 'org.apache.commons:commons-io:1.3.2' testImplementation 'org.mockito:mockito-core:2.8.9' testImplementation 'org.json:json:20160810' diff --git a/uhabits-core/src/main/java/org/isoron/uhabits/preferences/Preferences.java b/uhabits-core/src/main/java/org/isoron/uhabits/preferences/Preferences.java new file mode 100644 index 000000000..cb3004b23 --- /dev/null +++ b/uhabits-core/src/main/java/org/isoron/uhabits/preferences/Preferences.java @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2017 Á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.preferences; + +public interface Preferences +{ + + void setDeveloper(boolean isDeveloper); +} diff --git a/uhabits-core/src/main/java/org/isoron/uhabits/ui/about/AboutBehavior.java b/uhabits-core/src/main/java/org/isoron/uhabits/ui/about/AboutBehavior.java new file mode 100644 index 000000000..faa382311 --- /dev/null +++ b/uhabits-core/src/main/java/org/isoron/uhabits/ui/about/AboutBehavior.java @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2017 Á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.ui.about; + +import android.support.annotation.*; + +import org.isoron.uhabits.preferences.*; + +public class AboutBehavior +{ + private int developerCountdown = 5; + + @NonNull + private Preferences prefs; + + @NonNull + private Screen screen; + + public AboutBehavior(@NonNull Preferences prefs, @NonNull Screen screen) + { + this.prefs = prefs; + this.screen = screen; + } + + public void onPressDeveloperCountdown() + { + developerCountdown--; + if (developerCountdown <= 0) + { + prefs.setDeveloper(true); + screen.showMessage(Message.YOU_ARE_NOW_A_DEVELOPER); + } + } + + public void onRateApp() + { + screen.showRateAppWebsite(); + } + + public void onSendFeedback() + { + screen.showSendFeedbackScreen(); + } + + public void onTranslateApp() + { + screen.showTranslationWebsite(); + } + + public void onViewSourceCode() + { + screen.showSourceCodeWebsite(); + } + + public enum Message + { + YOU_ARE_NOW_A_DEVELOPER + } + + public interface Screen + { + void showMessage(Message message); + + void showRateAppWebsite(); + + void showSendFeedbackScreen(); + + void showSourceCodeWebsite(); + + void showTranslationWebsite(); + } + +} diff --git a/uhabits-core/src/main/java/org/isoron/uhabits/ui/habits/show/ShowHabitBehavior.java b/uhabits-core/src/main/java/org/isoron/uhabits/ui/habits/show/ShowHabitBehavior.java new file mode 100644 index 000000000..e66d6c71b --- /dev/null +++ b/uhabits-core/src/main/java/org/isoron/uhabits/ui/habits/show/ShowHabitBehavior.java @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2017 Á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.ui.habits.show; + +import android.support.annotation.*; + +import org.isoron.uhabits.commands.*; +import org.isoron.uhabits.models.*; + +import javax.inject.*; + +public class ShowHabitBehavior +{ + @NonNull + private final Habit habit; + + @NonNull + private final CommandRunner commandRunner; + + @NonNull + private Screen screen; + + @Inject + public ShowHabitBehavior(@NonNull CommandRunner commandRunner, + @NonNull Habit habit, + @NonNull Screen screen) + { + this.habit = habit; + this.commandRunner = commandRunner; + this.screen = screen; + } + + public void onEditHistory() + { + screen.showEditHistoryScreen(); + } + + public void onToggleCheckmark(long timestamp) + { + commandRunner.execute(new ToggleRepetitionCommand(habit, timestamp), + null); + } + + public interface Screen + { + void showEditHistoryScreen(); + } +} diff --git a/uhabits-core/src/main/java/org/isoron/uhabits/ui/habits/show/ShowHabitMenuBehavior.java b/uhabits-core/src/main/java/org/isoron/uhabits/ui/habits/show/ShowHabitMenuBehavior.java new file mode 100644 index 000000000..ae1ec3377 --- /dev/null +++ b/uhabits-core/src/main/java/org/isoron/uhabits/ui/habits/show/ShowHabitMenuBehavior.java @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2017 Á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.ui.habits.show; + +import android.support.annotation.*; + +import org.isoron.uhabits.models.*; +import org.isoron.uhabits.tasks.*; + +import java.io.*; +import java.util.*; + +import javax.inject.*; + +public class ShowHabitMenuBehavior +{ + private HabitList habitList; + + @NonNull + private final Habit habit; + + @NonNull + private final TaskRunner taskRunner; + + @NonNull + private Screen screen; + + @NonNull + private System system; + + @Inject + public ShowHabitMenuBehavior(@NonNull HabitList habitList, + @NonNull Habit habit, + @NonNull TaskRunner taskRunner, + @NonNull Screen screen, + @NonNull System system) + { + this.habitList = habitList; + this.habit = habit; + this.taskRunner = taskRunner; + this.screen = screen; + this.system = system; + } + + public void onEditHabit() + { + screen.showEditHabitScreen(habit); + } + + public void onExportCSV() + { + List selected = Collections.singletonList(habit); + File outputDir = system.getCSVOutputDir(); + + taskRunner.execute( + new ExportCSVTask(habitList, selected, outputDir, filename -> + { + if (filename != null) screen.showSendFileScreen(filename); + else screen.showMessage(Message.COULD_NOT_EXPORT); + })); + } + + public enum Message + { + COULD_NOT_EXPORT + } + + public interface Screen + { + void showEditHabitScreen(@NonNull Habit habit); + + void showMessage(Message m); + + void showSendFileScreen(String filename); + } + + public interface System + { + File getCSVOutputDir(); + } +} diff --git a/uhabits-core/src/test/java/org/isoron/uhabits/BaseUnitTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/BaseUnitTest.java index bceada3bc..35118052c 100644 --- a/uhabits-core/src/test/java/org/isoron/uhabits/BaseUnitTest.java +++ b/uhabits-core/src/test/java/org/isoron/uhabits/BaseUnitTest.java @@ -21,6 +21,7 @@ package org.isoron.uhabits; import org.isoron.uhabits.models.*; import org.isoron.uhabits.models.memory.*; +import org.isoron.uhabits.tasks.*; import org.isoron.uhabits.utils.*; import org.junit.*; @@ -34,6 +35,8 @@ public class BaseUnitTest protected MemoryModelFactory modelFactory; + protected SingleThreadTaskRunner taskRunner; + @Before public void setUp() { @@ -44,6 +47,7 @@ public class BaseUnitTest modelFactory = new MemoryModelFactory(); habitList = modelFactory.buildHabitList(); fixtures = new HabitFixtures(modelFactory); + taskRunner = new SingleThreadTaskRunner(); } @After diff --git a/uhabits-core/src/test/java/org/isoron/uhabits/ui/habits/show/ShowHabitMenuBehaviorTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/ui/habits/show/ShowHabitMenuBehaviorTest.java new file mode 100644 index 000000000..7a3c491d2 --- /dev/null +++ b/uhabits-core/src/test/java/org/isoron/uhabits/ui/habits/show/ShowHabitMenuBehaviorTest.java @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2017 Á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.ui.habits.show; + +import org.isoron.uhabits.*; +import org.isoron.uhabits.models.*; +import org.junit.*; + +import java.io.*; + +import static java.nio.file.Files.*; +import static org.apache.commons.io.FileUtils.*; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.*; + +public class ShowHabitMenuBehaviorTest extends BaseUnitTest +{ + private ShowHabitMenuBehavior.System system; + + private ShowHabitMenuBehavior.Screen screen; + + private Habit habit; + + private ShowHabitMenuBehavior menu; + + @Override + public void setUp() + { + super.setUp(); + system = mock(ShowHabitMenuBehavior.System.class); + screen = mock(ShowHabitMenuBehavior.Screen.class); + + habit = fixtures.createShortHabit(); + menu = new ShowHabitMenuBehavior(habitList, habit, taskRunner, screen, + system); + } + + @Test + public void testOnEditHabit() + { + menu.onEditHabit(); + verify(screen).showEditHabitScreen(habit); + } + + @Test + public void testOnExport() throws Exception + { + File outputDir = createTempDirectory("CSV").toFile(); + when(system.getCSVOutputDir()).thenReturn(outputDir); + menu.onExportCSV(); + assertThat(listFiles(outputDir, null, false).size(), equalTo(1)); + deleteDirectory(outputDir); + } +} \ No newline at end of file