diff --git a/app/src/androidTest/java/org/isoron/uhabits/espresso/MainActivityActions.java b/app/src/androidTest/java/org/isoron/uhabits/espresso/MainActivityActions.java
index 65059cebc..c03e9c9db 100644
--- a/app/src/androidTest/java/org/isoron/uhabits/espresso/MainActivityActions.java
+++ b/app/src/androidTest/java/org/isoron/uhabits/espresso/MainActivityActions.java
@@ -51,7 +51,7 @@ public class MainActivityActions
String num = "4";
String den = "8";
- onView(withId(R.id.action_add)).perform(click());
+ onView(withId(R.id.actionAdd)).perform(click());
typeHabitData(name, description, num, den);
diff --git a/app/src/androidTest/java/org/isoron/uhabits/espresso/MainTest.java b/app/src/androidTest/java/org/isoron/uhabits/espresso/MainTest.java
index 382d5db4f..8ada2ca29 100644
--- a/app/src/androidTest/java/org/isoron/uhabits/espresso/MainTest.java
+++ b/app/src/androidTest/java/org/isoron/uhabits/espresso/MainTest.java
@@ -145,7 +145,7 @@ public class MainTest
@Test
public void testAddInvalidHabit()
{
- onView(withId(R.id.action_add)).perform(click());
+ onView(withId(R.id.actionAdd)).perform(click());
typeHabitData("", "", "15", "7");
diff --git a/app/src/main/java/org/isoron/uhabits/HabitsApplication.java b/app/src/main/java/org/isoron/uhabits/HabitsApplication.java
index 865b2b40e..fca416df1 100644
--- a/app/src/main/java/org/isoron/uhabits/HabitsApplication.java
+++ b/app/src/main/java/org/isoron/uhabits/HabitsApplication.java
@@ -26,6 +26,8 @@ import android.support.annotation.*;
import com.activeandroid.*;
import org.isoron.uhabits.notifications.*;
+import org.isoron.uhabits.preferences.*;
+import org.isoron.uhabits.tasks.*;
import org.isoron.uhabits.utils.*;
import org.isoron.uhabits.widgets.*;
@@ -107,6 +109,16 @@ public class HabitsApplication extends Application
notificationTray = component.getNotificationTray();
notificationTray.startListening();
+ Preferences prefs = component.getPreferences();
+ prefs.initialize();
+ prefs.updateLastAppVersion();
+
+ TaskRunner taskRunner = component.getTaskRunner();
+ taskRunner.execute(() -> {
+ reminderScheduler.scheduleAll();
+ widgetUpdater.updateWidgets();
+ });
+
DatabaseUtils.initializeActiveAndroid();
}
diff --git a/app/src/main/java/org/isoron/uhabits/activities/BaseActivity.java b/app/src/main/java/org/isoron/uhabits/activities/BaseActivity.java
index 8640c722e..062b0927a 100644
--- a/app/src/main/java/org/isoron/uhabits/activities/BaseActivity.java
+++ b/app/src/main/java/org/isoron/uhabits/activities/BaseActivity.java
@@ -27,6 +27,8 @@ import android.view.*;
import org.isoron.uhabits.*;
+import static android.R.anim.*;
+
/**
* Base class for all activities in the application.
*
@@ -75,6 +77,17 @@ abstract public class BaseActivity extends AppCompatActivity
return baseMenu.onItemSelected(item);
}
+ public void restartWithFade()
+ {
+ new Handler().postDelayed(() -> {
+ Intent intent = new Intent(this, MainActivity.class);
+ finish();
+ overridePendingTransition(fade_in, fade_out);
+ startActivity(intent);
+
+ }, 500); // HACK: Let the menu disappear first
+ }
+
public void setBaseMenu(@Nullable BaseMenu baseMenu)
{
this.baseMenu = baseMenu;
diff --git a/app/src/main/java/org/isoron/uhabits/activities/ThemeSwitcher.java b/app/src/main/java/org/isoron/uhabits/activities/ThemeSwitcher.java
index c09fccd66..d560800ec 100644
--- a/app/src/main/java/org/isoron/uhabits/activities/ThemeSwitcher.java
+++ b/app/src/main/java/org/isoron/uhabits/activities/ThemeSwitcher.java
@@ -66,6 +66,17 @@ public class ThemeSwitcher
return getTheme() == THEME_DARK;
}
+ public void refreshTheme()
+ {
+
+ }
+
+ public void toggleNightMode()
+ {
+ if (isNightMode()) setTheme(THEME_LIGHT);
+ else setTheme(THEME_DARK);
+ }
+
private void applyDarkTheme()
{
if (preferences.isPureBlackEnabled())
diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsController.java b/app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsController.java
index 3fe40711f..baa95e137 100644
--- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsController.java
+++ b/app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsController.java
@@ -19,7 +19,6 @@
package org.isoron.uhabits.activities.habits.list;
-import android.os.*;
import android.support.annotation.*;
import org.isoron.uhabits.*;
@@ -69,6 +68,8 @@ public class ListHabitsController
private ImportDataTaskFactory importTaskFactory;
+ private ExportCSVTaskFactory exportCSVFactory;
+
@Inject
public ListHabitsController(@NonNull BaseSystem system,
@NonNull CommandRunner commandRunner,
@@ -79,7 +80,8 @@ public class ListHabitsController
@NonNull ReminderScheduler reminderScheduler,
@NonNull TaskRunner taskRunner,
@NonNull WidgetUpdater widgetUpdater,
- @NonNull ImportDataTaskFactory importTaskFactory)
+ @NonNull ImportDataTaskFactory importTaskFactory,
+ @NonNull ExportCSVTaskFactory exportCSVFactory)
{
this.adapter = adapter;
this.commandRunner = commandRunner;
@@ -91,6 +93,7 @@ public class ListHabitsController
this.reminderScheduler = reminderScheduler;
this.widgetUpdater = widgetUpdater;
this.importTaskFactory = importTaskFactory;
+ this.exportCSVFactory = exportCSVFactory;
}
public void onExportCSV()
@@ -98,7 +101,7 @@ public class ListHabitsController
List selected = new LinkedList<>();
for (Habit h : habitList) selected.add(h);
- taskRunner.execute(new ExportCSVTask(habitList, selected, filename -> {
+ taskRunner.execute(exportCSVFactory.create(selected, filename -> {
if (filename != null) screen.showSendFileScreen(filename);
else screen.showMessage(R.string.could_not_export);
}));
@@ -179,15 +182,8 @@ public class ListHabitsController
public void onStartup()
{
- prefs.initialize();
prefs.incrementLaunchCount();
- prefs.updateLastAppVersion();
if (prefs.isFirstRun()) onFirstRun();
-
- new Handler().postDelayed(() -> taskRunner.execute(() -> {
- reminderScheduler.scheduleAll();
- widgetUpdater.updateWidgets();
- }), 1000);
}
@Override
diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.java b/app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.java
index 13651cbf5..ebbd9d5d9 100644
--- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.java
+++ b/app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.java
@@ -67,10 +67,10 @@ public class ListHabitsMenu extends BaseMenu
@Override
public void onCreate(@NonNull Menu menu)
{
- MenuItem nightModeItem = menu.findItem(R.id.action_night_mode);
+ MenuItem nightModeItem = menu.findItem(R.id.actionToggleNightMode);
nightModeItem.setChecked(themeSwitcher.isNightMode());
- MenuItem showArchivedItem = menu.findItem(R.id.action_show_archived);
+ MenuItem showArchivedItem = menu.findItem(R.id.actionShowArchived);
showArchivedItem.setChecked(showArchived);
MenuItem showCompletedItem = menu.findItem(R.id.actionShowCompleted);
@@ -82,27 +82,27 @@ public class ListHabitsMenu extends BaseMenu
{
switch (item.getItemId())
{
- case R.id.action_night_mode:
+ case R.id.actionToggleNightMode:
screen.toggleNightMode();
return true;
- case R.id.action_add:
+ case R.id.actionAdd:
screen.showCreateHabitScreen();
return true;
- case R.id.action_faq:
+ case R.id.actionFAQ:
screen.showFAQScreen();
return true;
- case R.id.action_about:
+ case R.id.actionAbout:
screen.showAboutScreen();
return true;
- case R.id.action_settings:
+ case R.id.actionSettings:
screen.showSettingsScreen();
return true;
- case R.id.action_show_archived:
+ case R.id.actionShowArchived:
toggleShowArchived();
invalidate();
return true;
diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.java b/app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.java
index dd8553acf..295cb1678 100644
--- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.java
+++ b/app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.java
@@ -20,7 +20,6 @@
package org.isoron.uhabits.activities.habits.list;
import android.content.*;
-import android.os.*;
import android.support.annotation.*;
import org.isoron.uhabits.*;
@@ -233,23 +232,7 @@ public class ListHabitsScreen extends BaseScreen
public void toggleNightMode()
{
- if (themeSwitcher.isNightMode())
- themeSwitcher.setTheme(ThemeSwitcher.THEME_LIGHT);
- else themeSwitcher.setTheme(ThemeSwitcher.THEME_DARK);
-
- refreshTheme();
- }
-
- private void refreshTheme()
- {
- new Handler().postDelayed(() -> {
- Intent intent = new Intent(activity, MainActivity.class);
-
- activity.finish();
- activity.overridePendingTransition(android.R.anim.fade_in,
- android.R.anim.fade_out);
- activity.startActivity(intent);
-
- }, 500); // HACK: Let the menu disappear first
+ themeSwitcher.toggleNightMode();
+ activity.restartWithFade();
}
}
diff --git a/app/src/main/java/org/isoron/uhabits/receivers/WidgetController.java b/app/src/main/java/org/isoron/uhabits/receivers/WidgetController.java
index ffb488ba9..5aecbb970 100644
--- a/app/src/main/java/org/isoron/uhabits/receivers/WidgetController.java
+++ b/app/src/main/java/org/isoron/uhabits/receivers/WidgetController.java
@@ -23,6 +23,7 @@ import android.support.annotation.*;
import org.isoron.uhabits.commands.*;
import org.isoron.uhabits.models.*;
+import org.isoron.uhabits.notifications.*;
import javax.inject.*;
@@ -32,10 +33,14 @@ public class WidgetController
@NonNull
private final CommandRunner commandRunner;
+ private NotificationTray notificationTray;
+
@Inject
- public WidgetController(@NonNull CommandRunner commandRunner)
+ public WidgetController(@NonNull CommandRunner commandRunner,
+ @NonNull NotificationTray notificationTray)
{
this.commandRunner = commandRunner;
+ this.notificationTray = notificationTray;
}
public void onAddRepetition(@NonNull Habit habit, long timestamp)
@@ -43,6 +48,7 @@ public class WidgetController
Repetition rep = habit.getRepetitions().getByTimestamp(timestamp);
if (rep != null) return;
performToggle(habit, timestamp);
+ notificationTray.cancel(habit);
}
public void onRemoveRepetition(@NonNull Habit habit, long timestamp)
diff --git a/app/src/main/java/org/isoron/uhabits/tasks/ExportCSVTask.java b/app/src/main/java/org/isoron/uhabits/tasks/ExportCSVTask.java
index 018193fda..27f81f0b5 100644
--- a/app/src/main/java/org/isoron/uhabits/tasks/ExportCSVTask.java
+++ b/app/src/main/java/org/isoron/uhabits/tasks/ExportCSVTask.java
@@ -21,6 +21,8 @@ package org.isoron.uhabits.tasks;
import android.support.annotation.*;
+import com.google.auto.factory.*;
+
import org.isoron.uhabits.io.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.utils.*;
@@ -28,6 +30,7 @@ import org.isoron.uhabits.utils.*;
import java.io.*;
import java.util.*;
+@AutoFactory(allowSubclasses = true)
public class ExportCSVTask implements Task
{
private String archiveFilename;
@@ -41,7 +44,7 @@ public class ExportCSVTask implements Task
@NonNull
private final HabitList habitList;
- public ExportCSVTask(@NonNull HabitList habitList,
+ public ExportCSVTask(@Provided @NonNull HabitList habitList,
@NonNull List selectedHabits,
@NonNull Listener listener)
{
diff --git a/app/src/main/java/org/isoron/uhabits/tasks/ImportDataTask.java b/app/src/main/java/org/isoron/uhabits/tasks/ImportDataTask.java
index 0080b20cc..e19e7b8fc 100644
--- a/app/src/main/java/org/isoron/uhabits/tasks/ImportDataTask.java
+++ b/app/src/main/java/org/isoron/uhabits/tasks/ImportDataTask.java
@@ -27,7 +27,7 @@ import org.isoron.uhabits.io.*;
import java.io.*;
-@AutoFactory
+@AutoFactory(allowSubclasses = true)
public class ImportDataTask implements Task
{
public static final int FAILED = 3;
diff --git a/app/src/main/res/menu/list_habits.xml b/app/src/main/res/menu/list_habits.xml
index 5ad16cd12..0b0563cc2 100644
--- a/app/src/main/res/menu/list_habits.xml
+++ b/app/src/main/res/menu/list_habits.xml
@@ -23,7 +23,7 @@
tools:context=".MainActivity">
@@ -35,7 +35,7 @@
app:showAsAction="ifRoom">