diff --git a/app/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.java b/app/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.java
index d5679c08c..e4f412993 100644
--- a/app/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.java
+++ b/app/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.java
@@ -66,8 +66,6 @@ public class BaseAndroidTest
@Inject
protected HabitLogger logger;
- protected AndroidTestComponent androidTestComponent;
-
protected HabitFixtures fixtures;
protected CountDownLatch latch;
@@ -87,9 +85,13 @@ public class BaseAndroidTest
DateUtils.setFixedLocalTime(FIXED_LOCAL_TIME);
setTheme(R.style.AppBaseTheme);
- androidTestComponent = DaggerAndroidTestComponent.builder().build();
- HabitsApplication.setComponent(androidTestComponent);
- androidTestComponent.inject(this);
+ AppComponent component = DaggerAppComponent.builder().build();
+ HabitsApplication.setComponent(component);
+ prefs = component.getPreferences();
+ habitList = component.getHabitList();
+ commandRunner = component.getCommandRunner();
+ taskRunner = component.getTaskRunner();
+ logger = component.getHabitsLogger();
fixtures = new HabitFixtures(habitList);
diff --git a/app/src/androidTest/java/org/isoron/uhabits/HabitsApplicationTest.java b/app/src/androidTest/java/org/isoron/uhabits/HabitsApplicationTest.java
index b5a60751f..83b8579c2 100644
--- a/app/src/androidTest/java/org/isoron/uhabits/HabitsApplicationTest.java
+++ b/app/src/androidTest/java/org/isoron/uhabits/HabitsApplicationTest.java
@@ -45,9 +45,6 @@ public class HabitsApplicationTest extends BaseAndroidTest
String msg = "LOGCAT TEST";
new RuntimeException(msg).printStackTrace();
- HabitsApplication app = HabitsApplication.getInstance();
- assert(app != null);
-
BaseSystem system = new BaseSystem(targetContext);
String log = system.getLogcat();
assertThat(log, containsString(msg));
diff --git a/app/src/main/java/org/isoron/uhabits/BaseComponent.java b/app/src/main/java/org/isoron/uhabits/AppComponent.java
similarity index 77%
rename from app/src/main/java/org/isoron/uhabits/BaseComponent.java
rename to app/src/main/java/org/isoron/uhabits/AppComponent.java
index 04e73ff49..770a3271d 100644
--- a/app/src/main/java/org/isoron/uhabits/BaseComponent.java
+++ b/app/src/main/java/org/isoron/uhabits/AppComponent.java
@@ -23,24 +23,29 @@ import org.isoron.uhabits.commands.*;
import org.isoron.uhabits.intents.*;
import org.isoron.uhabits.io.*;
import org.isoron.uhabits.models.*;
+import org.isoron.uhabits.models.sqlite.*;
+import org.isoron.uhabits.receivers.*;
import org.isoron.uhabits.tasks.*;
-import org.isoron.uhabits.ui.common.dialogs.*;
+import org.isoron.uhabits.ui.widgets.*;
import org.isoron.uhabits.utils.*;
-/**
- * Base component for dependency injection.
- */
-public interface BaseComponent
+import javax.inject.*;
+
+import dagger.*;
+
+@Singleton
+@Component(modules = {
+ AppModule.class, AndroidTaskRunner.class, SQLModelFactory.class
+})
+public interface AppComponent
{
CommandRunner getCommandRunner();
- DialogFactory getDialogFactory();
-
DirFinder getDirFinder();
HabitList getHabitList();
- HabitLogger getHabitLogger();
+ HabitLogger getHabitsLogger();
IntentFactory getIntentFactory();
@@ -52,9 +57,13 @@ public interface BaseComponent
Preferences getPreferences();
+ ReceiverActions getReceiverActions();
+
ReminderScheduler getReminderScheduler();
TaskRunner getTaskRunner();
WidgetPreferences getWidgetPreferences();
+
+ WidgetUpdater getWidgetUpdater();
}
diff --git a/app/src/androidTest/java/org/isoron/uhabits/AndroidTestComponent.java b/app/src/main/java/org/isoron/uhabits/AppContext.java
similarity index 78%
rename from app/src/androidTest/java/org/isoron/uhabits/AndroidTestComponent.java
rename to app/src/main/java/org/isoron/uhabits/AppContext.java
index 4c73578d6..ebd0aab10 100644
--- a/app/src/androidTest/java/org/isoron/uhabits/AndroidTestComponent.java
+++ b/app/src/main/java/org/isoron/uhabits/AppContext.java
@@ -19,14 +19,13 @@
package org.isoron.uhabits;
-import javax.inject.Singleton;
+import java.lang.annotation.*;
-import dagger.Component;
+import javax.inject.*;
-@Singleton
-@Component(modules = {AndroidModule.class})
-public interface AndroidTestComponent extends BaseComponent
+@Qualifier
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+public @interface AppContext
{
- void inject(BaseAndroidTest baseAndroidTest);
}
-
diff --git a/app/src/main/java/org/isoron/uhabits/AndroidModule.java b/app/src/main/java/org/isoron/uhabits/AppModule.java
similarity index 53%
rename from app/src/main/java/org/isoron/uhabits/AndroidModule.java
rename to app/src/main/java/org/isoron/uhabits/AppModule.java
index 48a972469..c5aa66c70 100644
--- a/app/src/main/java/org/isoron/uhabits/AndroidModule.java
+++ b/app/src/main/java/org/isoron/uhabits/AppModule.java
@@ -21,47 +21,22 @@ package org.isoron.uhabits;
import android.content.*;
-import org.isoron.uhabits.models.*;
-import org.isoron.uhabits.models.sqlite.*;
-import org.isoron.uhabits.tasks.*;
-
-import javax.inject.*;
-
import dagger.*;
-/**
- * Module that provides dependencies when the application is running on
- * Android.
- *
- * This module is also used for instrumented tests.
- */
@Module
-public class AndroidModule
+public class AppModule
{
- @Provides
- @Singleton
- static HabitList provideHabitList()
- {
- return SQLiteHabitList.getInstance();
- }
+ private final Context context;
- @Provides
- static ModelFactory provideModelFactory()
- {
- return new SQLModelFactory();
- }
-
- @Provides
- @Singleton
- static Context provideApplicationContext()
+ public AppModule(@AppContext Context context)
{
- return HabitsApplication.getContext();
+ this.context = context;
}
@Provides
- @Singleton
- static TaskRunner provideTaskRunner()
+ @AppContext
+ Context getContext()
{
- return new AndroidTaskRunner();
+ return context;
}
}
diff --git a/app/src/main/java/org/isoron/uhabits/HabitsApplication.java b/app/src/main/java/org/isoron/uhabits/HabitsApplication.java
index 90d7520a1..009f240cf 100644
--- a/app/src/main/java/org/isoron/uhabits/HabitsApplication.java
+++ b/app/src/main/java/org/isoron/uhabits/HabitsApplication.java
@@ -35,30 +35,18 @@ import java.io.*;
*/
public class HabitsApplication extends Application
{
- public static final int RESULT_BUG_REPORT = 4;
-
- public static final int RESULT_EXPORT_CSV = 2;
-
- public static final int RESULT_EXPORT_DB = 3;
-
- public static final int RESULT_IMPORT_DATA = 1;
-
- @Nullable
- private static HabitsApplication application;
-
- private static BaseComponent component;
-
- @Nullable
private static Context context;
+ private static AppComponent component;
+
private static WidgetUpdater widgetUpdater;
- public static BaseComponent getComponent()
+ public static AppComponent getComponent()
{
return component;
}
- public static void setComponent(BaseComponent component)
+ public static void setComponent(AppComponent component)
{
HabitsApplication.component = component;
}
@@ -70,21 +58,6 @@ public class HabitsApplication extends Application
return context;
}
- @Nullable
- public static HabitsApplication getInstance()
- {
- return application;
- }
-
- @NonNull
- public static WidgetUpdater getWidgetUpdater()
- {
- if (widgetUpdater == null) throw new RuntimeException(
- "widgetUpdater is null");
-
- return widgetUpdater;
- }
-
public static boolean isTestMode()
{
try
@@ -107,8 +80,11 @@ public class HabitsApplication extends Application
{
super.onCreate();
HabitsApplication.context = this;
- HabitsApplication.application = this;
- component = DaggerAndroidComponent.builder().build();
+
+ component = DaggerAppComponent
+ .builder()
+ .appModule(new AppModule(context))
+ .build();
if (isTestMode())
{
@@ -116,7 +92,7 @@ public class HabitsApplication extends Application
if (db.exists()) db.delete();
}
- widgetUpdater = new WidgetUpdater(this);
+ widgetUpdater = component.getWidgetUpdater();
widgetUpdater.startListening();
DatabaseUtils.initializeActiveAndroid();
diff --git a/app/src/main/java/org/isoron/uhabits/intents/IntentScheduler.java b/app/src/main/java/org/isoron/uhabits/intents/IntentScheduler.java
index 76bf70b89..a5c89801e 100644
--- a/app/src/main/java/org/isoron/uhabits/intents/IntentScheduler.java
+++ b/app/src/main/java/org/isoron/uhabits/intents/IntentScheduler.java
@@ -24,6 +24,8 @@ import android.content.*;
import android.os.*;
import android.support.annotation.*;
+import org.isoron.uhabits.*;
+
import javax.inject.*;
import static android.app.AlarmManager.*;
@@ -35,7 +37,7 @@ public class IntentScheduler
private final AlarmManager manager;
@Inject
- public IntentScheduler(@NonNull Context context)
+ public IntentScheduler(@AppContext Context context)
{
manager = (AlarmManager) context.getSystemService(ALARM_SERVICE);
}
diff --git a/app/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.java b/app/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.java
index 9be18a4c0..c3aa7eddc 100644
--- a/app/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.java
+++ b/app/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.java
@@ -35,13 +35,12 @@ import static android.app.PendingIntent.*;
@Singleton
public class PendingIntentFactory
{
- @NonNull
private final Context context;
private IntentFactory intentFactory;
@Inject
- public PendingIntentFactory(@NonNull Context context)
+ public PendingIntentFactory(@AppContext Context context)
{
this.context = context;
intentFactory = HabitsApplication.getComponent().getIntentFactory();
diff --git a/app/src/main/java/org/isoron/uhabits/io/DirFinder.java b/app/src/main/java/org/isoron/uhabits/io/DirFinder.java
index 08754b4af..392f7716c 100644
--- a/app/src/main/java/org/isoron/uhabits/io/DirFinder.java
+++ b/app/src/main/java/org/isoron/uhabits/io/DirFinder.java
@@ -42,9 +42,9 @@ public class DirFinder
private final Context context;
@Inject
- public DirFinder()
+ public DirFinder(@AppContext Context context)
{
- context = HabitsApplication.getContext();
+ this.context = context;
}
@Nullable
diff --git a/app/src/main/java/org/isoron/uhabits/io/HabitBullCSVImporter.java b/app/src/main/java/org/isoron/uhabits/io/HabitBullCSVImporter.java
index 7a51670c8..87bbe2bb7 100644
--- a/app/src/main/java/org/isoron/uhabits/io/HabitBullCSVImporter.java
+++ b/app/src/main/java/org/isoron/uhabits/io/HabitBullCSVImporter.java
@@ -24,6 +24,7 @@ import android.support.annotation.NonNull;
import com.activeandroid.ActiveAndroid;
import com.opencsv.CSVReader;
+import org.isoron.uhabits.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.utils.DateUtils;
diff --git a/app/src/main/java/org/isoron/uhabits/io/RewireDBImporter.java b/app/src/main/java/org/isoron/uhabits/io/RewireDBImporter.java
index e2020f360..3d8bc593e 100644
--- a/app/src/main/java/org/isoron/uhabits/io/RewireDBImporter.java
+++ b/app/src/main/java/org/isoron/uhabits/io/RewireDBImporter.java
@@ -23,6 +23,7 @@ import android.database.*;
import android.database.sqlite.*;
import android.support.annotation.*;
+import org.isoron.uhabits.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.utils.DatabaseUtils;
import org.isoron.uhabits.utils.*;
diff --git a/app/src/main/java/org/isoron/uhabits/io/TickmateDBImporter.java b/app/src/main/java/org/isoron/uhabits/io/TickmateDBImporter.java
index 47bdd09ad..b96742cfe 100644
--- a/app/src/main/java/org/isoron/uhabits/io/TickmateDBImporter.java
+++ b/app/src/main/java/org/isoron/uhabits/io/TickmateDBImporter.java
@@ -19,17 +19,16 @@
package org.isoron.uhabits.io;
-import android.database.Cursor;
-import android.database.sqlite.SQLiteDatabase;
-import android.support.annotation.NonNull;
+import android.database.*;
+import android.database.sqlite.*;
+import android.support.annotation.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.utils.DatabaseUtils;
-import org.isoron.uhabits.utils.DateUtils;
+import org.isoron.uhabits.utils.*;
-import java.io.File;
-import java.io.IOException;
-import java.util.GregorianCalendar;
+import java.io.*;
+import java.util.*;
/**
* Class that imports data from database files exported by Tickmate.
diff --git a/app/src/main/java/org/isoron/uhabits/models/Habit.java b/app/src/main/java/org/isoron/uhabits/models/Habit.java
index 6ce0ca307..643a430c9 100644
--- a/app/src/main/java/org/isoron/uhabits/models/Habit.java
+++ b/app/src/main/java/org/isoron/uhabits/models/Habit.java
@@ -70,19 +70,6 @@ public class Habit
private ModelObservable observable = new ModelObservable();
- private ModelFactory factory;
-
- /**
- * Constructs a habit with the same attributes as the specified habit.
- *
- * @param model the model whose attributes should be copied from
- */
- public Habit(Habit model)
- {
- copyFrom(model);
- buildLists();
- }
-
/**
* Constructs a habit with default attributes.
*
@@ -95,13 +82,8 @@ public class Habit
this.archived = false;
this.frequency = new Frequency(3, 7);
- buildLists();
- }
-
- private void buildLists()
- {
- factory = HabitsApplication.getComponent().getModelFactory();
-
+ ModelFactory factory =
+ HabitsApplication.getComponent().getModelFactory();
checkmarks = factory.buildCheckmarkList(this);
streaks = factory.buildStreakList(this);
scores = factory.buildScoreList(this);
diff --git a/app/src/main/java/org/isoron/uhabits/models/memory/MemoryModelFactory.java b/app/src/main/java/org/isoron/uhabits/models/memory/MemoryModelFactory.java
index 86e0eb9fe..6b76ab426 100644
--- a/app/src/main/java/org/isoron/uhabits/models/memory/MemoryModelFactory.java
+++ b/app/src/main/java/org/isoron/uhabits/models/memory/MemoryModelFactory.java
@@ -21,12 +21,31 @@ package org.isoron.uhabits.models.memory;
import org.isoron.uhabits.models.*;
+import javax.inject.*;
+
+import dagger.*;
+
+@Module
public class MemoryModelFactory implements ModelFactory
{
+ @Provides
+ @Singleton
+ public static HabitList provideHabitList()
+ {
+ return new MemoryHabitList();
+ }
+
+ @Provides
+ @Singleton
+ public static ModelFactory provideModelFactory()
+ {
+ return new MemoryModelFactory();
+ }
+
@Override
- public RepetitionList buildRepetitionList(Habit habit)
+ public CheckmarkList buildCheckmarkList(Habit habit)
{
- return new MemoryRepetitionList(habit);
+ return new MemoryCheckmarkList(habit);
}
@Override
@@ -36,9 +55,9 @@ public class MemoryModelFactory implements ModelFactory
}
@Override
- public CheckmarkList buildCheckmarkList(Habit habit)
+ public RepetitionList buildRepetitionList(Habit habit)
{
- return new MemoryCheckmarkList(habit);
+ return new MemoryRepetitionList(habit);
}
@Override
diff --git a/app/src/main/java/org/isoron/uhabits/models/sqlite/SQLModelFactory.java b/app/src/main/java/org/isoron/uhabits/models/sqlite/SQLModelFactory.java
index 70b1e9e70..915451784 100644
--- a/app/src/main/java/org/isoron/uhabits/models/sqlite/SQLModelFactory.java
+++ b/app/src/main/java/org/isoron/uhabits/models/sqlite/SQLModelFactory.java
@@ -23,22 +23,25 @@ import org.isoron.uhabits.models.*;
import javax.inject.*;
+import dagger.*;
+
/**
* Factory that provides models backed by an SQLite database.
*/
-@Singleton
+@Module
public class SQLModelFactory implements ModelFactory
{
- @Inject
- public SQLModelFactory()
+ @Provides
+ public static ModelFactory provideModelFactory()
{
-
+ return new SQLModelFactory();
}
- @Override
- public RepetitionList buildRepetitionList(Habit habit)
+ @Provides
+ @Singleton
+ static HabitList provideHabitList()
{
- return new SQLiteRepetitionList(habit);
+ return SQLiteHabitList.getInstance();
}
@Override
@@ -53,6 +56,12 @@ public class SQLModelFactory implements ModelFactory
return SQLiteHabitList.getInstance();
}
+ @Override
+ public RepetitionList buildRepetitionList(Habit habit)
+ {
+ return new SQLiteRepetitionList(habit);
+ }
+
@Override
public ScoreList buildScoreList(Habit habit)
{
diff --git a/app/src/main/java/org/isoron/uhabits/receivers/PebbleReceiver.java b/app/src/main/java/org/isoron/uhabits/receivers/PebbleReceiver.java
index e35cc1172..af4d069b8 100644
--- a/app/src/main/java/org/isoron/uhabits/receivers/PebbleReceiver.java
+++ b/app/src/main/java/org/isoron/uhabits/receivers/PebbleReceiver.java
@@ -51,7 +51,7 @@ public class PebbleReceiver extends PebbleDataReceiver
public PebbleReceiver()
{
super(WATCHAPP_UUID);
- BaseComponent component = HabitsApplication.getComponent();
+ AppComponent component = HabitsApplication.getComponent();
commandRunner = component.getCommandRunner();
taskRunner = component.getTaskRunner();
allHabits = component.getHabitList();
diff --git a/app/src/main/java/org/isoron/uhabits/receivers/ReceiverActions.java b/app/src/main/java/org/isoron/uhabits/receivers/ReceiverActions.java
index ab86ebdaa..dfde77bed 100644
--- a/app/src/main/java/org/isoron/uhabits/receivers/ReceiverActions.java
+++ b/app/src/main/java/org/isoron/uhabits/receivers/ReceiverActions.java
@@ -21,34 +21,37 @@ package org.isoron.uhabits.receivers;
import android.support.annotation.*;
-import org.isoron.uhabits.*;
import org.isoron.uhabits.commands.*;
import org.isoron.uhabits.models.*;
+import javax.inject.*;
+
+@Singleton
public class ReceiverActions
{
private final CommandRunner commandRunner;
- public ReceiverActions()
+ @Inject
+ public ReceiverActions(CommandRunner commandRunner)
{
- commandRunner = HabitsApplication.getComponent().getCommandRunner();
+ this.commandRunner = commandRunner;
}
- public void add_repetition(@NonNull Habit habit, long timestamp)
+ public void addRepetition(@NonNull Habit habit, long timestamp)
{
Repetition rep = habit.getRepetitions().getByTimestamp(timestamp);
if (rep != null) return;
- toggle_repetition(habit, timestamp);
+ toggleRepetition(habit, timestamp);
}
- public void remove_repetition(@NonNull Habit habit, long timestamp)
+ public void removeRepetition(@NonNull Habit habit, long timestamp)
{
Repetition rep = habit.getRepetitions().getByTimestamp(timestamp);
if (rep == null) return;
- toggle_repetition(habit, timestamp);
+ toggleRepetition(habit, timestamp);
}
- public void toggle_repetition(@NonNull Habit habit, long timestamp)
+ public void toggleRepetition(@NonNull Habit habit, long timestamp)
{
commandRunner.execute(new ToggleRepetitionCommand(habit, timestamp),
habit.getId());
diff --git a/app/src/main/java/org/isoron/uhabits/receivers/ReminderReceiver.java b/app/src/main/java/org/isoron/uhabits/receivers/ReminderReceiver.java
index 837829e51..6627817f6 100644
--- a/app/src/main/java/org/isoron/uhabits/receivers/ReminderReceiver.java
+++ b/app/src/main/java/org/isoron/uhabits/receivers/ReminderReceiver.java
@@ -64,7 +64,7 @@ public class ReminderReceiver extends BroadcastReceiver
{
super();
- BaseComponent component = HabitsApplication.getComponent();
+ AppComponent component = HabitsApplication.getComponent();
habits = component.getHabitList();
taskRunner = component.getTaskRunner();
reminderScheduler = component.getReminderScheduler();
diff --git a/app/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java b/app/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java
index f3658f62b..6cff6fcb4 100644
--- a/app/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java
+++ b/app/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java
@@ -57,11 +57,10 @@ public class WidgetReceiver extends BroadcastReceiver
public WidgetReceiver()
{
- super();
- habits = HabitsApplication.getComponent().getHabitList();
+ AppComponent component = HabitsApplication.getComponent();
+ habits = component.getHabitList();
+ actions = component.getReceiverActions();
parser = new IntentParser(habits);
- actions = new ReceiverActions();
-
}
@Override
@@ -96,20 +95,20 @@ public class WidgetReceiver extends BroadcastReceiver
{
IntentParser.CheckmarkIntentData data;
data = parser.parseCheckmarkIntent(intent);
- actions.add_repetition(data.habit, data.timestamp);
+ actions.addRepetition(data.habit, data.timestamp);
}
private void onActionRemoveRepetition(Intent intent)
{
IntentParser.CheckmarkIntentData data;
data = parser.parseCheckmarkIntent(intent);
- actions.remove_repetition(data.habit, data.timestamp);
+ actions.removeRepetition(data.habit, data.timestamp);
}
private void onActionToggleRepetition(Intent intent)
{
IntentParser.CheckmarkIntentData data;
data = parser.parseCheckmarkIntent(intent);
- actions.toggle_repetition(data.habit, data.timestamp);
+ actions.toggleRepetition(data.habit, data.timestamp);
}
}
diff --git a/app/src/main/java/org/isoron/uhabits/tasks/AndroidTaskRunner.java b/app/src/main/java/org/isoron/uhabits/tasks/AndroidTaskRunner.java
index 7f39f8b7f..0e3473a3d 100644
--- a/app/src/main/java/org/isoron/uhabits/tasks/AndroidTaskRunner.java
+++ b/app/src/main/java/org/isoron/uhabits/tasks/AndroidTaskRunner.java
@@ -26,17 +26,25 @@ import java.util.concurrent.*;
import javax.inject.*;
+import dagger.*;
+
+@Module
@Singleton
public class AndroidTaskRunner implements TaskRunner
{
private final LinkedList activeTasks;
- @Inject
public AndroidTaskRunner()
{
activeTasks = new LinkedList<>();
}
+ @Provides
+ public static TaskRunner provideTaskRunner()
+ {
+ return new AndroidTaskRunner();
+ }
+
@Override
public void execute(Task task)
{
@@ -56,13 +64,14 @@ public class AndroidTaskRunner implements TaskRunner
throws TimeoutException, InterruptedException
{
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN)
- throw new UnsupportedOperationException("waitForTasks requires API 16+");
+ throw new UnsupportedOperationException(
+ "waitForTasks requires API 16+");
int poolInterval = 100;
- while(timeout > 0)
+ while (timeout > 0)
{
- if(activeTasks.isEmpty()) return;
+ if (activeTasks.isEmpty()) return;
timeout -= poolInterval;
Thread.sleep(poolInterval);
@@ -105,16 +114,16 @@ public class AndroidTaskRunner implements TaskRunner
}
@Override
- protected void onProgressUpdate(Integer... values)
+ protected void onPreExecute()
{
- task.onProgressUpdate(values[0]);
+ activeTasks.add(this);
+ task.onPreExecute();
}
@Override
- protected void onPreExecute()
+ protected void onProgressUpdate(Integer... values)
{
- activeTasks.add(this);
- task.onPreExecute();
+ task.onProgressUpdate(values[0]);
}
}
}
diff --git a/app/src/main/java/org/isoron/uhabits/tasks/SingleThreadTaskRunner.java b/app/src/main/java/org/isoron/uhabits/tasks/SingleThreadTaskRunner.java
index 34f32d109..06a77466e 100644
--- a/app/src/main/java/org/isoron/uhabits/tasks/SingleThreadTaskRunner.java
+++ b/app/src/main/java/org/isoron/uhabits/tasks/SingleThreadTaskRunner.java
@@ -21,8 +21,20 @@ package org.isoron.uhabits.tasks;
import java.util.concurrent.*;
+import javax.inject.*;
+
+import dagger.*;
+
+@Module
public class SingleThreadTaskRunner implements TaskRunner
{
+ @Provides
+ @Singleton
+ public static SingleThreadTaskRunner getInstance()
+ {
+ return new SingleThreadTaskRunner();
+ }
+
@Override
public void execute(Task task)
{
diff --git a/app/src/main/java/org/isoron/uhabits/AndroidComponent.java b/app/src/main/java/org/isoron/uhabits/ui/ActivityComponent.java
similarity index 73%
rename from app/src/main/java/org/isoron/uhabits/AndroidComponent.java
rename to app/src/main/java/org/isoron/uhabits/ui/ActivityComponent.java
index 4a53960e0..641bd6fd4 100644
--- a/app/src/main/java/org/isoron/uhabits/AndroidComponent.java
+++ b/app/src/main/java/org/isoron/uhabits/ui/ActivityComponent.java
@@ -17,18 +17,14 @@
* with this program. If not, see .
*/
-package org.isoron.uhabits;
+package org.isoron.uhabits.ui;
-import javax.inject.Singleton;
+import org.isoron.uhabits.ui.common.dialogs.*;
-import dagger.Component;
+import dagger.*;
-/**
- * Dependency injection component for classes that are specific to Android.
- */
-@Singleton
-@Component(modules = {AndroidModule.class})
-public interface AndroidComponent extends BaseComponent
+@Component(modules = { ActivityModule.class })
+public interface ActivityComponent
{
+ DialogFactory getDialogFactory();
}
-
diff --git a/app/src/main/java/org/isoron/uhabits/ui/ActivityContext.java b/app/src/main/java/org/isoron/uhabits/ui/ActivityContext.java
new file mode 100644
index 000000000..9ea1b7de0
--- /dev/null
+++ b/app/src/main/java/org/isoron/uhabits/ui/ActivityContext.java
@@ -0,0 +1,31 @@
+/*
+ * 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.ui;
+
+import java.lang.annotation.*;
+
+import javax.inject.*;
+
+@Qualifier
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ActivityContext
+{
+}
diff --git a/app/src/main/java/org/isoron/uhabits/ui/ActivityModule.java b/app/src/main/java/org/isoron/uhabits/ui/ActivityModule.java
new file mode 100644
index 000000000..3c935e3a3
--- /dev/null
+++ b/app/src/main/java/org/isoron/uhabits/ui/ActivityModule.java
@@ -0,0 +1,42 @@
+/*
+ * 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.ui;
+
+import android.content.*;
+
+import dagger.*;
+
+@Module
+public class ActivityModule
+{
+ private final Context context;
+
+ public ActivityModule(@ActivityContext Context context)
+ {
+ this.context = context;
+ }
+
+ @Provides
+ @ActivityContext
+ Context getContext()
+ {
+ return context;
+ }
+}
diff --git a/app/src/main/java/org/isoron/uhabits/ui/BaseActivity.java b/app/src/main/java/org/isoron/uhabits/ui/BaseActivity.java
index 0009a82d4..7570b6658 100644
--- a/app/src/main/java/org/isoron/uhabits/ui/BaseActivity.java
+++ b/app/src/main/java/org/isoron/uhabits/ui/BaseActivity.java
@@ -51,6 +51,13 @@ abstract public class BaseActivity extends AppCompatActivity
@Nullable
private BaseScreen screen;
+ private ActivityComponent component;
+
+ public ActivityComponent getComponent()
+ {
+ return component;
+ }
+
@Override
public boolean onCreateOptionsMenu(@Nullable Menu menu)
{
@@ -123,5 +130,10 @@ abstract public class BaseActivity extends AppCompatActivity
InterfaceUtils.applyCurrentTheme(this);
androidExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(this);
+
+ component = DaggerActivityComponent
+ .builder()
+ .activityModule(new ActivityModule(this))
+ .build();
}
}
diff --git a/app/src/main/java/org/isoron/uhabits/ui/BaseSystem.java b/app/src/main/java/org/isoron/uhabits/ui/BaseSystem.java
index 357b64fc3..ed14fe1f6 100644
--- a/app/src/main/java/org/isoron/uhabits/ui/BaseSystem.java
+++ b/app/src/main/java/org/isoron/uhabits/ui/BaseSystem.java
@@ -25,7 +25,6 @@ import android.support.annotation.*;
import android.view.*;
import org.isoron.uhabits.*;
-import org.isoron.uhabits.models.*;
import org.isoron.uhabits.utils.*;
import java.io.*;
@@ -46,9 +45,6 @@ public class BaseSystem
{
private Context context;
- @Inject
- HabitList habitList;
-
@Inject
ReminderScheduler reminderScheduler;
@@ -56,8 +52,7 @@ public class BaseSystem
{
this.context = context;
- BaseComponent component = HabitsApplication.getComponent();
- habitList = component.getHabitList();
+ AppComponent component = HabitsApplication.getComponent();
reminderScheduler = component.getReminderScheduler();
}
diff --git a/app/src/main/java/org/isoron/uhabits/ui/common/dialogs/ColorPickerDialog.java b/app/src/main/java/org/isoron/uhabits/ui/common/dialogs/ColorPickerDialog.java
index e8da43dfa..ce1135e56 100644
--- a/app/src/main/java/org/isoron/uhabits/ui/common/dialogs/ColorPickerDialog.java
+++ b/app/src/main/java/org/isoron/uhabits/ui/common/dialogs/ColorPickerDialog.java
@@ -29,10 +29,10 @@ import org.isoron.uhabits.utils.*;
*/
public class ColorPickerDialog extends com.android.colorpicker.ColorPickerDialog
{
- public static ColorPickerDialog newInstance(int paletteColor)
+ public static ColorPickerDialog newInstance(Context context,
+ int paletteColor)
{
ColorPickerDialog dialog = new ColorPickerDialog();
- Context context = dialog.getContext();
StyledResources res = new StyledResources(context);
int color = ColorUtils.getColor(context, paletteColor);
diff --git a/app/src/main/java/org/isoron/uhabits/ui/common/dialogs/DialogFactory.java b/app/src/main/java/org/isoron/uhabits/ui/common/dialogs/DialogFactory.java
index a684d7704..449830a73 100644
--- a/app/src/main/java/org/isoron/uhabits/ui/common/dialogs/DialogFactory.java
+++ b/app/src/main/java/org/isoron/uhabits/ui/common/dialogs/DialogFactory.java
@@ -23,6 +23,7 @@ import android.content.*;
import android.support.annotation.*;
import org.isoron.uhabits.models.*;
+import org.isoron.uhabits.ui.*;
import org.isoron.uhabits.ui.habits.edit.*;
import java.io.*;
@@ -31,21 +32,22 @@ import javax.inject.*;
public class DialogFactory
{
+ private final Context context;
+
@Inject
- public DialogFactory()
+ public DialogFactory(@ActivityContext Context context)
{
-
+ this.context = context;
}
@NonNull
public ColorPickerDialog buildColorPicker(int paletteColor)
{
- return ColorPickerDialog.newInstance(paletteColor);
+ return ColorPickerDialog.newInstance(context, paletteColor);
}
@NonNull
public ConfirmDeleteDialog buildConfirmDeleteDialog(
- @NonNull Context context,
@NonNull ConfirmDeleteDialog.Callback callback)
{
return new ConfirmDeleteDialog(context, callback);
@@ -64,7 +66,7 @@ public class DialogFactory
}
@NonNull
- public FilePickerDialog buildFilePicker(Context context, File dir)
+ public FilePickerDialog buildFilePicker(File dir)
{
return new FilePickerDialog(context, dir);
}
diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/edit/BaseDialog.java b/app/src/main/java/org/isoron/uhabits/ui/habits/edit/BaseDialog.java
index 0f131d9a7..00ec1ace2 100644
--- a/app/src/main/java/org/isoron/uhabits/ui/habits/edit/BaseDialog.java
+++ b/app/src/main/java/org/isoron/uhabits/ui/habits/edit/BaseDialog.java
@@ -19,6 +19,7 @@
package org.isoron.uhabits.ui.habits.edit;
+import android.app.*;
import android.os.*;
import android.support.annotation.*;
import android.support.v7.app.*;
@@ -26,10 +27,12 @@ import android.text.format.*;
import android.view.*;
import com.android.datetimepicker.time.*;
+import com.android.datetimepicker.time.TimePickerDialog;
import org.isoron.uhabits.*;
import org.isoron.uhabits.commands.*;
import org.isoron.uhabits.models.*;
+import org.isoron.uhabits.ui.*;
import org.isoron.uhabits.ui.common.dialogs.*;
import org.isoron.uhabits.utils.*;
@@ -63,11 +66,10 @@ public abstract class BaseDialog extends AppCompatDialogFragment
{
View view = inflater.inflate(R.layout.edit_habit, container, false);
- BaseComponent component = HabitsApplication.getComponent();
+ AppComponent component = HabitsApplication.getComponent();
prefs = component.getPreferences();
habitList = component.getHabitList();
commandRunner = component.getCommandRunner();
- dialogFactory = component.getDialogFactory();
ButterKnife.bind(this, view);
@@ -79,6 +81,16 @@ public abstract class BaseDialog extends AppCompatDialogFragment
return view;
}
+ @Override
+ public void onAttach(Activity activity)
+ {
+ super.onAttach(activity);
+
+ BaseActivity baseActivity = (BaseActivity) activity;
+ ActivityComponent component = baseActivity.getComponent();
+ dialogFactory = component.getDialogFactory();
+ }
+
@OnItemSelected(R.id.sFrequency)
public void onFrequencySelected(int position)
{
diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsController.java b/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsController.java
index d2044abdf..258742bfc 100644
--- a/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsController.java
+++ b/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsController.java
@@ -29,6 +29,7 @@ import org.isoron.uhabits.tasks.*;
import org.isoron.uhabits.ui.*;
import org.isoron.uhabits.ui.habits.list.controllers.*;
import org.isoron.uhabits.ui.habits.list.model.*;
+import org.isoron.uhabits.ui.widgets.*;
import org.isoron.uhabits.utils.*;
import java.io.*;
@@ -68,7 +69,7 @@ public class ListHabitsController
this.habitList = habitList;
this.adapter = adapter;
- BaseComponent component = HabitsApplication.getComponent();
+ AppComponent component = HabitsApplication.getComponent();
prefs = component.getPreferences();
taskRunner = component.getTaskRunner();
commandRunner = component.getCommandRunner();
@@ -165,11 +166,16 @@ public class ListHabitsController
prefs.updateLastAppVersion();
if (prefs.isFirstRun()) onFirstRun();
- new Handler().postDelayed(() -> {
- ReminderScheduler reminderScheduler =
- HabitsApplication.getComponent().getReminderScheduler();
- taskRunner.execute(() -> reminderScheduler.schedule(habitList));
- HabitsApplication.getWidgetUpdater().updateWidgets();
+ new Handler().postDelayed(() ->
+ {
+ AppComponent component = HabitsApplication.getComponent();
+ ReminderScheduler scheduler = component.getReminderScheduler();
+ WidgetUpdater widgetUpdater = component.getWidgetUpdater();
+
+ taskRunner.execute(() -> {
+ scheduler.schedule(habitList);
+ widgetUpdater.updateWidgets();
+ });
}, 1000);
}
diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsScreen.java b/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsScreen.java
index 3e4b09524..e631d28f9 100644
--- a/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsScreen.java
+++ b/app/src/main/java/org/isoron/uhabits/ui/habits/list/ListHabitsScreen.java
@@ -39,6 +39,14 @@ import java.io.*;
public class ListHabitsScreen extends BaseScreen
implements CommandRunner.Listener
{
+ public static final int RESULT_BUG_REPORT = 4;
+
+ public static final int RESULT_EXPORT_CSV = 2;
+
+ public static final int RESULT_EXPORT_DB = 3;
+
+ public static final int RESULT_IMPORT_DATA = 1;
+
@Nullable
ListHabitsController controller;
@@ -59,11 +67,11 @@ public class ListHabitsScreen extends BaseScreen
super(activity);
setRootView(rootView);
- BaseComponent component = HabitsApplication.getComponent();
- dialogFactory = component.getDialogFactory();
- intentFactory = component.getIntentFactory();
- dirFinder = component.getDirFinder();
- commandRunner = component.getCommandRunner();
+ AppComponent comp = HabitsApplication.getComponent();
+ intentFactory = comp.getIntentFactory();
+ dirFinder = comp.getDirFinder();
+ commandRunner = comp.getCommandRunner();
+ dialogFactory = activity.getComponent().getDialogFactory();
}
public void onAttached()
@@ -90,19 +98,19 @@ public class ListHabitsScreen extends BaseScreen
switch (resultCode)
{
- case HabitsApplication.RESULT_IMPORT_DATA:
+ case RESULT_IMPORT_DATA:
showImportScreen();
break;
- case HabitsApplication.RESULT_EXPORT_CSV:
+ case RESULT_EXPORT_CSV:
controller.onExportCSV();
break;
- case HabitsApplication.RESULT_EXPORT_DB:
+ case RESULT_EXPORT_DB:
controller.onExportDB();
break;
- case HabitsApplication.RESULT_BUG_REPORT:
+ case RESULT_BUG_REPORT:
controller.onSendBugReport();
break;
}
@@ -145,7 +153,7 @@ public class ListHabitsScreen extends BaseScreen
public void showDeleteConfirmationScreen(ConfirmDeleteDialog.Callback callback)
{
ConfirmDeleteDialog dialog =
- dialogFactory.buildConfirmDeleteDialog(activity, callback);
+ dialogFactory.buildConfirmDeleteDialog(callback);
activity.showDialog(dialog);
}
@@ -177,7 +185,7 @@ public class ListHabitsScreen extends BaseScreen
return;
}
- FilePickerDialog picker = dialogFactory.buildFilePicker(activity, dir);
+ FilePickerDialog picker = dialogFactory.buildFilePicker(dir);
if (controller != null)
picker.setListener(file -> controller.onImportData(file));
activity.showDialog(picker.getDialog());
diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardListCache.java b/app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardListCache.java
index 639579e42..2b4821d1c 100644
--- a/app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardListCache.java
+++ b/app/src/main/java/org/isoron/uhabits/ui/habits/list/model/HabitCardListCache.java
@@ -66,7 +66,7 @@ public class HabitCardListCache implements CommandRunner.Listener
this.listener = new Listener() {};
data = new CacheData();
- BaseComponent component = HabitsApplication.getComponent();
+ AppComponent component = HabitsApplication.getComponent();
commandRunner = component.getCommandRunner();
taskRunner = component.getTaskRunner();
}
diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/show/ShowHabitScreen.java b/app/src/main/java/org/isoron/uhabits/ui/habits/show/ShowHabitScreen.java
index 6bfdff981..7a4f669e1 100644
--- a/app/src/main/java/org/isoron/uhabits/ui/habits/show/ShowHabitScreen.java
+++ b/app/src/main/java/org/isoron/uhabits/ui/habits/show/ShowHabitScreen.java
@@ -21,7 +21,6 @@ package org.isoron.uhabits.ui.habits.show;
import android.support.annotation.*;
-import org.isoron.uhabits.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.ui.*;
import org.isoron.uhabits.ui.common.dialogs.*;
@@ -39,7 +38,7 @@ public class ShowHabitScreen extends BaseScreen
ShowHabitRootView view)
{
super(activity);
- dialogFactory = HabitsApplication.getComponent().getDialogFactory();
+ dialogFactory = activity.getComponent().getDialogFactory();
this.habit = habit;
setRootView(view);
diff --git a/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/ScoreCard.java b/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/ScoreCard.java
index e50fb2176..3ab06e4cc 100644
--- a/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/ScoreCard.java
+++ b/app/src/main/java/org/isoron/uhabits/ui/habits/show/views/ScoreCard.java
@@ -83,7 +83,7 @@ public class ScoreCard extends HabitCard
public void onItemSelected(int position)
{
setBucketSizeFromPosition(position);
- HabitsApplication.getWidgetUpdater().updateWidgets();
+ HabitsApplication.getComponent().getWidgetUpdater().updateWidgets();
refreshData();
}
diff --git a/app/src/main/java/org/isoron/uhabits/ui/settings/SettingsFragment.java b/app/src/main/java/org/isoron/uhabits/ui/settings/SettingsFragment.java
index 3dd3d6b64..85cf523b3 100644
--- a/app/src/main/java/org/isoron/uhabits/ui/settings/SettingsFragment.java
+++ b/app/src/main/java/org/isoron/uhabits/ui/settings/SettingsFragment.java
@@ -25,10 +25,9 @@ import android.os.*;
import android.support.v7.preference.*;
import org.isoron.uhabits.R;
+import org.isoron.uhabits.ui.habits.list.*;
import org.isoron.uhabits.utils.*;
-import static org.isoron.uhabits.HabitsApplication.*;
-
public class SettingsFragment extends PreferenceFragmentCompat
implements SharedPreferences.OnSharedPreferenceChangeListener
{
@@ -55,10 +54,10 @@ public class SettingsFragment extends PreferenceFragmentCompat
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
- setResultOnPreferenceClick("importData", RESULT_IMPORT_DATA);
- setResultOnPreferenceClick("exportCSV", RESULT_EXPORT_CSV);
- setResultOnPreferenceClick("exportDB", RESULT_EXPORT_DB);
- setResultOnPreferenceClick("bugReport", RESULT_BUG_REPORT);
+ setResultOnPreferenceClick("importData", ListHabitsScreen.RESULT_IMPORT_DATA);
+ setResultOnPreferenceClick("exportCSV", ListHabitsScreen.RESULT_EXPORT_CSV);
+ setResultOnPreferenceClick("exportDB", ListHabitsScreen.RESULT_EXPORT_DB);
+ setResultOnPreferenceClick("bugReport", ListHabitsScreen.RESULT_BUG_REPORT);
updateRingtoneDescription();
diff --git a/app/src/main/java/org/isoron/uhabits/ui/widgets/HabitPickerDialog.java b/app/src/main/java/org/isoron/uhabits/ui/widgets/HabitPickerDialog.java
index ad4edb9af..cff3d74ed 100644
--- a/app/src/main/java/org/isoron/uhabits/ui/widgets/HabitPickerDialog.java
+++ b/app/src/main/java/org/isoron/uhabits/ui/widgets/HabitPickerDialog.java
@@ -52,7 +52,8 @@ public class HabitPickerDialog extends Activity
{
Long habitId = habitIds.get(position);
preferences.addWidget(widgetId, habitId);
- HabitsApplication.getWidgetUpdater().updateWidgets();
+
+ HabitsApplication.getComponent().getWidgetUpdater().updateWidgets();
Intent resultValue = new Intent();
resultValue.putExtra(EXTRA_APPWIDGET_ID, widgetId);
@@ -66,7 +67,7 @@ public class HabitPickerDialog extends Activity
super.onCreate(savedInstanceState);
setContentView(R.layout.widget_configure_activity);
- BaseComponent component = HabitsApplication.getComponent();
+ AppComponent component = HabitsApplication.getComponent();
habitList = component.getHabitList();
preferences = component.getWidgetPreferences();
diff --git a/app/src/main/java/org/isoron/uhabits/ui/widgets/WidgetUpdater.java b/app/src/main/java/org/isoron/uhabits/ui/widgets/WidgetUpdater.java
index 83c6e5dc0..89cb3adf1 100644
--- a/app/src/main/java/org/isoron/uhabits/ui/widgets/WidgetUpdater.java
+++ b/app/src/main/java/org/isoron/uhabits/ui/widgets/WidgetUpdater.java
@@ -27,6 +27,8 @@ import org.isoron.uhabits.*;
import org.isoron.uhabits.commands.*;
import org.isoron.uhabits.widgets.*;
+import javax.inject.*;
+
/**
* A WidgetUpdater listens to the commands being executed by the application and
* updates the home-screen widgets accordingly.
@@ -36,15 +38,18 @@ import org.isoron.uhabits.widgets.*;
*/
public class WidgetUpdater implements CommandRunner.Listener
{
+ @NonNull
private final CommandRunner commandRunner;
@NonNull
private final Context context;
- public WidgetUpdater(@NonNull Context context)
+ @Inject
+ public WidgetUpdater(@NonNull @AppContext Context context,
+ @NonNull CommandRunner commandRunner)
{
this.context = context;
- commandRunner = HabitsApplication.getComponent().getCommandRunner();
+ this.commandRunner = commandRunner;
}
@Override
diff --git a/app/src/main/java/org/isoron/uhabits/utils/Preferences.java b/app/src/main/java/org/isoron/uhabits/utils/Preferences.java
index 0557bafd0..5c8dbf593 100644
--- a/app/src/main/java/org/isoron/uhabits/utils/Preferences.java
+++ b/app/src/main/java/org/isoron/uhabits/utils/Preferences.java
@@ -29,14 +29,14 @@ import javax.inject.*;
@Singleton
public class Preferences
{
- private Context context;
+ private final Context context;
private SharedPreferences prefs;
@Inject
- public Preferences()
+ public Preferences(@AppContext Context context)
{
- this.context = HabitsApplication.getContext();
+ this.context = context;
prefs = PreferenceManager.getDefaultSharedPreferences(context);
}
diff --git a/app/src/main/java/org/isoron/uhabits/utils/ReminderScheduler.java b/app/src/main/java/org/isoron/uhabits/utils/ReminderScheduler.java
index 29cf7519e..b7da6257a 100644
--- a/app/src/main/java/org/isoron/uhabits/utils/ReminderScheduler.java
+++ b/app/src/main/java/org/isoron/uhabits/utils/ReminderScheduler.java
@@ -44,10 +44,10 @@ public class ReminderScheduler
@Inject
public ReminderScheduler()
{
- BaseComponent component = HabitsApplication.getComponent();
+ AppComponent component = HabitsApplication.getComponent();
pendingIntentFactory = component.getPendingIntentFactory();
intentScheduler = component.getIntentScheduler();
- logger = component.getHabitLogger();
+ logger = component.getHabitsLogger();
}
public void schedule(@NonNull Habit habit, @Nullable Long reminderTime)
diff --git a/app/src/main/java/org/isoron/uhabits/utils/WidgetPreferences.java b/app/src/main/java/org/isoron/uhabits/utils/WidgetPreferences.java
index e0b3e4f5c..e302329f7 100644
--- a/app/src/main/java/org/isoron/uhabits/utils/WidgetPreferences.java
+++ b/app/src/main/java/org/isoron/uhabits/utils/WidgetPreferences.java
@@ -22,16 +22,17 @@ package org.isoron.uhabits.utils;
import android.content.*;
import android.preference.*;
+import org.isoron.uhabits.*;
+
import javax.inject.*;
@Singleton
public class WidgetPreferences
{
-
- private SharedPreferences prefs;
+ private final SharedPreferences prefs;
@Inject
- public WidgetPreferences(Context context)
+ public WidgetPreferences(@AppContext Context context)
{
prefs = PreferenceManager.getDefaultSharedPreferences(context);
}
diff --git a/app/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java b/app/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java
index b1b3b8903..29d462c16 100644
--- a/app/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java
+++ b/app/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java
@@ -42,7 +42,7 @@ public abstract class BaseWidgetProvider extends AppWidgetProvider
public BaseWidgetProvider()
{
- BaseComponent component = HabitsApplication.getComponent();
+ AppComponent component = HabitsApplication.getComponent();
habits = component.getHabitList();
widgetPrefs = component.getWidgetPreferences();
}
diff --git a/app/src/test/java/org/isoron/uhabits/TestModule.java b/app/src/test/java/org/isoron/uhabits/MockModule.java
similarity index 90%
rename from app/src/test/java/org/isoron/uhabits/TestModule.java
rename to app/src/test/java/org/isoron/uhabits/MockModule.java
index 44a03a62d..bf4e7b044 100644
--- a/app/src/test/java/org/isoron/uhabits/TestModule.java
+++ b/app/src/test/java/org/isoron/uhabits/MockModule.java
@@ -22,9 +22,9 @@ package org.isoron.uhabits;
import org.isoron.uhabits.intents.*;
import org.isoron.uhabits.io.*;
import org.isoron.uhabits.models.*;
-import org.isoron.uhabits.models.memory.*;
import org.isoron.uhabits.tasks.*;
import org.isoron.uhabits.ui.common.dialogs.*;
+import org.isoron.uhabits.ui.widgets.*;
import org.isoron.uhabits.utils.*;
import javax.inject.*;
@@ -34,7 +34,7 @@ import dagger.*;
import static org.mockito.Mockito.*;
@Module
-public class TestModule
+public class MockModule
{
@Provides
@Singleton
@@ -56,13 +56,6 @@ public class TestModule
return mock(Habit.class);
}
- @Singleton
- @Provides
- HabitList provideHabitList()
- {
- return new MemoryHabitList();
- }
-
@Provides
@Singleton
IntentFactory provideIntentFactory()
@@ -84,13 +77,6 @@ public class TestModule
return mock(HabitLogger.class);
}
- @Provides
- @Singleton
- ModelFactory provideModelFactory()
- {
- return new MemoryModelFactory();
- }
-
@Singleton
@Provides
PendingIntentFactory providePendingIntentFactory()
@@ -125,4 +111,11 @@ public class TestModule
{
return new SingleThreadTaskRunner();
}
+
+ @Provides
+ @Singleton
+ WidgetUpdater provideWidgetUpdate()
+ {
+ return mock(WidgetUpdater.class);
+ }
}
diff --git a/app/src/test/java/org/isoron/uhabits/TestComponent.java b/app/src/test/java/org/isoron/uhabits/TestComponent.java
index 8d73408e6..f7d724275 100644
--- a/app/src/test/java/org/isoron/uhabits/TestComponent.java
+++ b/app/src/test/java/org/isoron/uhabits/TestComponent.java
@@ -19,13 +19,15 @@
package org.isoron.uhabits;
-import javax.inject.Singleton;
+import org.isoron.uhabits.models.memory.*;
-import dagger.Component;
+import javax.inject.*;
+
+import dagger.*;
@Singleton
-@Component(modules = {TestModule.class})
-public interface TestComponent extends BaseComponent
+@Component(modules = { MockModule.class, MemoryModelFactory.class })
+public interface TestComponent extends AppComponent
{
void inject(BaseUnitTest baseUnitTest);
}
diff --git a/app/src/test/java/org/isoron/uhabits/ui/habits/list/ListHabitsScreenTest.java b/app/src/test/java/org/isoron/uhabits/ui/habits/list/ListHabitsScreenTest.java
index a3f5f904b..358c2bf84 100644
--- a/app/src/test/java/org/isoron/uhabits/ui/habits/list/ListHabitsScreenTest.java
+++ b/app/src/test/java/org/isoron/uhabits/ui/habits/list/ListHabitsScreenTest.java
@@ -58,7 +58,11 @@ public class ListHabitsScreenTest extends BaseUnitTest
{
super.setUp();
+ ActivityComponent activityComponent = mock(ActivityComponent.class);
+
activity = mock(BaseActivity.class);
+ when(activity.getComponent()).thenReturn(activityComponent);
+
rootView = mock(ListHabitsRootView.class);
controller = mock(ListHabitsController.class);
intent = mock(Intent.class);
@@ -82,28 +86,28 @@ public class ListHabitsScreenTest extends BaseUnitTest
@Test
public void testOnResult_bugReport()
{
- screen.onResult(0, HabitsApplication.RESULT_BUG_REPORT, null);
+ screen.onResult(0, ListHabitsScreen.RESULT_BUG_REPORT, null);
verify(controller).onSendBugReport();
}
@Test
public void testOnResult_exportCSV()
{
- screen.onResult(0, HabitsApplication.RESULT_EXPORT_CSV, null);
+ screen.onResult(0, ListHabitsScreen.RESULT_EXPORT_CSV, null);
verify(controller).onExportCSV();
}
@Test
public void testOnResult_exportDB()
{
- screen.onResult(0, HabitsApplication.RESULT_EXPORT_DB, null);
+ screen.onResult(0, ListHabitsScreen.RESULT_EXPORT_DB, null);
verify(controller).onExportDB();
}
@Test
public void testOnResult_importData()
{
- screen.onResult(0, HabitsApplication.RESULT_IMPORT_DATA, null);
+ screen.onResult(0, ListHabitsScreen.RESULT_IMPORT_DATA, null);
testShowImportScreen();
}
@@ -136,8 +140,7 @@ public class ListHabitsScreenTest extends BaseUnitTest
callback = mock(ConfirmDeleteDialog.Callback.class);
ConfirmDeleteDialog dialog = mock(ConfirmDeleteDialog.class);
- when(dialogFactory.buildConfirmDeleteDialog(activity,
- callback)).thenReturn(dialog);
+ when(dialogFactory.buildConfirmDeleteDialog(callback)).thenReturn(dialog);
screen.showDeleteConfirmationScreen(callback);
@@ -180,7 +183,7 @@ public class ListHabitsScreenTest extends BaseUnitTest
FilePickerDialog picker = mock(FilePickerDialog.class);
AppCompatDialog dialog = mock(AppCompatDialog.class);
when(picker.getDialog()).thenReturn(dialog);
- when(dialogFactory.buildFilePicker(activity, dir)).thenReturn(picker);
+ when(dialogFactory.buildFilePicker(dir)).thenReturn(picker);
screen.showImportScreen();