diff --git a/app/src/main/java/org/isoron/uhabits/activities/BaseRootView.java b/app/src/main/java/org/isoron/uhabits/activities/BaseRootView.java
index af3867ead..93fbe562f 100644
--- a/app/src/main/java/org/isoron/uhabits/activities/BaseRootView.java
+++ b/app/src/main/java/org/isoron/uhabits/activities/BaseRootView.java
@@ -42,17 +42,16 @@ import static android.os.Build.VERSION_CODES.*;
*/
public abstract class BaseRootView extends FrameLayout
{
+ @NonNull
private final Context context;
- private final BaseActivity activity;
-
private final ThemeSwitcher themeSwitcher;
- public BaseRootView(Context context)
+ public BaseRootView(@NonNull Context context)
{
super(context);
this.context = context;
- activity = (BaseActivity) context;
+ BaseActivity activity = (BaseActivity) context;
themeSwitcher = activity.getComponent().getThemeSwitcher();
}
diff --git a/app/src/main/java/org/isoron/uhabits/activities/BaseScreen.java b/app/src/main/java/org/isoron/uhabits/activities/BaseScreen.java
index 64621414c..302ec7db1 100644
--- a/app/src/main/java/org/isoron/uhabits/activities/BaseScreen.java
+++ b/app/src/main/java/org/isoron/uhabits/activities/BaseScreen.java
@@ -61,7 +61,7 @@ public class BaseScreen
@Nullable
private BaseSelectionMenu selectionMenu;
- private Snackbar snackbar;
+ protected Snackbar snackbar;
public BaseScreen(@NonNull BaseActivity activity)
{
diff --git a/app/src/main/java/org/isoron/uhabits/activities/BaseSelectionMenu.java b/app/src/main/java/org/isoron/uhabits/activities/BaseSelectionMenu.java
index a5c7f5cca..2b3c56d25 100644
--- a/app/src/main/java/org/isoron/uhabits/activities/BaseSelectionMenu.java
+++ b/app/src/main/java/org/isoron/uhabits/activities/BaseSelectionMenu.java
@@ -59,16 +59,16 @@ public abstract class BaseSelectionMenu
/**
* Called when the menu is first displayed.
*
- * This method cannot be overridden. The application should override the
- * methods onCreate(Menu) and getMenuResourceId instead.
+ * This method should not be overridden. The application should override
+ * the methods onCreate(Menu) and getMenuResourceId instead.
*
* @param inflater a menu inflater, for creating the menu
* @param mode the action mode associated with this menu.
* @param menu the menu that is being created.
*/
- public final void onCreate(@NonNull MenuInflater inflater,
- @NonNull ActionMode mode,
- @NonNull Menu menu)
+ public void onCreate(@NonNull MenuInflater inflater,
+ @NonNull ActionMode mode,
+ @NonNull Menu menu)
{
this.actionMode = mode;
inflater.inflate(getResourceId(), menu);
diff --git a/app/src/test/java/org/isoron/uhabits/activities/BaseActivityTest.java b/app/src/test/java/org/isoron/uhabits/activities/BaseActivityTest.java
index ec7835b8c..aa94d89fe 100644
--- a/app/src/test/java/org/isoron/uhabits/activities/BaseActivityTest.java
+++ b/app/src/test/java/org/isoron/uhabits/activities/BaseActivityTest.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.
*
diff --git a/app/src/test/java/org/isoron/uhabits/activities/BaseScreenTest.java b/app/src/test/java/org/isoron/uhabits/activities/BaseScreenTest.java
new file mode 100644
index 000000000..7fdc7375b
--- /dev/null
+++ b/app/src/test/java/org/isoron/uhabits/activities/BaseScreenTest.java
@@ -0,0 +1,140 @@
+/*
+ * 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;
+
+import android.content.*;
+import android.support.annotation.*;
+import android.support.v7.view.ActionMode;
+import android.support.v7.widget.*;
+import android.view.*;
+
+import org.isoron.uhabits.*;
+import org.junit.*;
+import org.junit.runner.*;
+import org.robolectric.*;
+import org.robolectric.annotation.*;
+
+import java.util.*;
+
+import static android.view.View.*;
+import static junit.framework.Assert.assertNotNull;
+import static org.hamcrest.core.IsEqual.*;
+import static org.junit.Assert.*;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.*;
+import static org.robolectric.Robolectric.*;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(constants = BuildConfig.class)
+public class BaseScreenTest
+{
+ @Test
+ public void selectionMenuTest()
+ {
+ BaseSelectionMenu selectionMenu = spy(new BaseSelectionMenu()
+ {
+ @Override
+ protected int getResourceId()
+ {
+ return R.menu.list_habits_selection;
+ }
+ });
+
+ ActionModeActivity activity = setupActivity(ActionModeActivity.class);
+ BaseScreen screen = new BaseScreen(activity);
+ screen.setSelectionMenu(selectionMenu);
+ activity.setScreen(screen);
+
+ screen.startSelection();
+ assertNotNull(activity.callback);
+ verify(selectionMenu).onCreate(any(), any(), any());
+ verify(selectionMenu).onPrepare(any());
+
+ ActionMode mode = mock(ActionMode.class);
+ MenuItem item = mock(MenuItem.class);
+
+ activity.callback.onActionItemClicked(mode, item);
+ verify(selectionMenu).onItemClicked(item);
+
+ activity.callback.onDestroyActionMode(mode);
+ verify(selectionMenu).onFinish();
+ }
+
+ @Test
+ public void showMessageTest()
+ {
+ EmptyActivity activity = setupActivity(EmptyActivity.class);
+ ConcreteRootView rootView = new ConcreteRootView(activity);
+ View decor = activity.getWindow().getDecorView();
+ BaseScreen screen = new BaseScreen(activity);
+ screen.setRootView(rootView);
+ activity.setScreen(screen);
+
+ ArrayList matches = new ArrayList<>();
+
+ screen.showMessage(R.string.checkmark);
+ decor.findViewsWithText(matches, "Checkmark", FIND_VIEWS_WITH_TEXT);
+ assertThat(matches.size(), equalTo(1));
+ assertTrue(matches.get(0).isShown());
+
+ screen.showMessage(R.string.frequency);
+ decor.findViewsWithText(matches, "Frequency", FIND_VIEWS_WITH_TEXT);
+ assertThat(matches.size(), equalTo(1));
+ assertTrue(matches.get(0).isShown());
+ }
+
+ static class ActionModeActivity extends BaseActivity
+ {
+ private ActionMode.Callback callback;
+
+ @Nullable
+ @Override
+ public ActionMode startSupportActionMode(
+ @NonNull ActionMode.Callback callback)
+ {
+ this.callback = callback;
+ return super.startSupportActionMode(this.callback);
+ }
+ }
+
+ static class ConcreteRootView extends BaseRootView
+ {
+ private final Toolbar toolbar;
+
+ public ConcreteRootView(@NonNull Context context)
+ {
+ super(context);
+ toolbar = new Toolbar(context);
+ addView(toolbar);
+ }
+
+ @NonNull
+ @Override
+ public Toolbar getToolbar()
+ {
+ return toolbar;
+ }
+ }
+
+ static class EmptyActivity extends BaseActivity
+ {
+
+ }
+}