Remove remaining static references to app component

This commit is contained in:
2016-07-27 18:09:36 -04:00
parent ddc85ced0b
commit 237de035bb
33 changed files with 258 additions and 265 deletions

View File

@@ -41,8 +41,14 @@ public interface AppComponent
{
CommandRunner getCommandRunner();
CreateHabitCommandFactory getCreateHabitCommandFactory();
DirFinder getDirFinder();
EditHabitCommandFactory getEditHabitCommandFactory();
GenericImporter getGenericImporter();
HabitList getHabitList();
HabitLogger getHabitsLogger();

View File

@@ -41,12 +41,6 @@ public class HabitsApplication extends Application
private static WidgetUpdater widgetUpdater;
@Deprecated
public static AppComponent getStaticComponent()
{
return component;
}
public AppComponent getComponent()
{
return component;

View File

@@ -59,6 +59,10 @@ public abstract class BaseDialog extends AppCompatDialogFragment
private DialogFactory dialogFactory;
protected AppComponent component;
protected ModelFactory modelFactory;
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container,
@@ -67,11 +71,11 @@ public abstract class BaseDialog extends AppCompatDialogFragment
View view = inflater.inflate(R.layout.edit_habit, container, false);
HabitsApplication app = (HabitsApplication) getContext().getApplicationContext();
AppComponent component = app.getComponent();
component = app.getComponent();
prefs = component.getPreferences();
habitList = component.getHabitList();
commandRunner = component.getCommandRunner();
modelFactory = component.getModelFactory();
ButterKnife.bind(this, view);

View File

@@ -37,7 +37,7 @@ public class CreateHabitDialog extends BaseDialog
@Override
protected void initializeHabits()
{
modifiedHabit = new Habit();
modifiedHabit = modelFactory.buildHabit();
modifiedHabit.setFrequency(Frequency.DAILY);
modifiedHabit.setColor(
prefs.getDefaultHabitColor(modifiedHabit.getColor()));
@@ -46,7 +46,9 @@ public class CreateHabitDialog extends BaseDialog
@Override
protected void saveHabit()
{
Command command = new CreateHabitCommand(habitList, modifiedHabit);
Command command = component
.getCreateHabitCommandFactory()
.create(habitList, modifiedHabit);
commandRunner.execute(command, null);
}
}

View File

@@ -29,7 +29,7 @@ public class EditHabitDialog extends BaseDialog
{
public static EditHabitDialog newInstance(Habit habit)
{
if(habit.getId() == null)
if (habit.getId() == null)
throw new IllegalArgumentException("habit not saved");
EditHabitDialog frag = new EditHabitDialog();
@@ -53,15 +53,15 @@ public class EditHabitDialog extends BaseDialog
throw new IllegalArgumentException("habitId must be specified");
originalHabit = habitList.getById(habitId);
modifiedHabit = new Habit();
modifiedHabit = modelFactory.buildHabit();
modifiedHabit.copyFrom(originalHabit);
}
@Override
protected void saveHabit()
{
Command command =
new EditHabitCommand(habitList, originalHabit, modifiedHabit);
Command command = component.getEditHabitCommandFactory().
create(habitList, originalHabit, modifiedHabit);
commandRunner.execute(command, originalHabit.getId());
}
}

View File

@@ -23,12 +23,12 @@ import android.os.*;
import android.support.annotation.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.commands.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.tasks.*;
import org.isoron.uhabits.activities.*;
import org.isoron.uhabits.activities.habits.list.controllers.*;
import org.isoron.uhabits.activities.habits.list.model.*;
import org.isoron.uhabits.commands.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.tasks.*;
import org.isoron.uhabits.utils.*;
import org.isoron.uhabits.widgets.*;
@@ -66,6 +66,8 @@ public class ListHabitsController
private WidgetUpdater widgetUpdater;
private ImportDataTaskFactory importTaskFactory;
@Inject
public ListHabitsController(@NonNull BaseSystem system,
@NonNull CommandRunner commandRunner,
@@ -75,7 +77,8 @@ public class ListHabitsController
@NonNull Preferences prefs,
@NonNull ReminderScheduler reminderScheduler,
@NonNull TaskRunner taskRunner,
@NonNull WidgetUpdater widgetUpdater)
@NonNull WidgetUpdater widgetUpdater,
@NonNull ImportDataTaskFactory importTaskFactory)
{
this.adapter = adapter;
this.commandRunner = commandRunner;
@@ -86,6 +89,7 @@ public class ListHabitsController
this.taskRunner = taskRunner;
this.reminderScheduler = reminderScheduler;
this.widgetUpdater = widgetUpdater;
this.importTaskFactory = importTaskFactory;
}
public void onExportCSV()
@@ -121,7 +125,7 @@ public class ListHabitsController
public void onImportData(@NonNull File file)
{
taskRunner.execute(new ImportDataTask(habitList, file, result -> {
taskRunner.execute(importTaskFactory.create(file, result -> {
switch (result)
{
case ImportDataTask.SUCCESS:

View File

@@ -25,6 +25,7 @@ import android.util.*;
import android.widget.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.models.memory.*;
public abstract class HabitCard extends LinearLayout
implements ModelObservable.Listener
@@ -97,6 +98,6 @@ public abstract class HabitCard extends LinearLayout
private void init()
{
if(!isInEditMode()) habit = new Habit();
if(!isInEditMode()) habit = new MemoryModelFactory().buildHabit();
}
}

View File

@@ -19,21 +19,32 @@
package org.isoron.uhabits.commands;
import android.support.annotation.*;
import com.google.auto.factory.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.models.*;
/**
* Command to create a habit.
*/
@AutoFactory
public class CreateHabitCommand extends Command
{
private ModelFactory modelFactory;
HabitList habitList;
private Habit model;
private Long savedId;
public CreateHabitCommand(HabitList habitList, Habit model)
public CreateHabitCommand(@Provided @NonNull ModelFactory modelFactory,
@NonNull HabitList habitList,
@NonNull Habit model)
{
this.modelFactory = modelFactory;
this.habitList = habitList;
this.model = model;
}
@@ -41,7 +52,7 @@ public class CreateHabitCommand extends Command
@Override
public void execute()
{
Habit savedHabit = new Habit();
Habit savedHabit = modelFactory.buildHabit();
savedHabit.copyFrom(model);
savedHabit.setId(savedId);
@@ -49,15 +60,6 @@ public class CreateHabitCommand extends Command
savedId = savedHabit.getId();
}
@Override
public void undo()
{
Habit habit = habitList.getById(savedId);
if(habit == null) throw new RuntimeException("Habit not found");
habitList.remove(habit);
}
@Override
public Integer getExecuteStringId()
{
@@ -70,4 +72,13 @@ public class CreateHabitCommand extends Command
return R.string.toast_habit_deleted;
}
@Override
public void undo()
{
Habit habit = habitList.getById(savedId);
if (habit == null) throw new RuntimeException("Habit not found");
habitList.remove(habit);
}
}

View File

@@ -19,12 +19,17 @@
package org.isoron.uhabits.commands;
import android.support.annotation.*;
import com.google.auto.factory.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.models.*;
/**
* Command to modify a habit.
*/
@AutoFactory
public class EditHabitCommand extends Command
{
HabitList habitList;
@@ -37,12 +42,15 @@ public class EditHabitCommand extends Command
private boolean hasFrequencyChanged;
public EditHabitCommand(HabitList habitList, Habit original, Habit modified)
public EditHabitCommand(@Provided @NonNull ModelFactory modelFactory,
@NonNull HabitList habitList,
@NonNull Habit original,
@NonNull Habit modified)
{
this.habitList = habitList;
this.savedId = original.getId();
this.modified = new Habit();
this.original = new Habit();
this.modified = modelFactory.buildHabit();
this.original = modelFactory.buildHabit();
this.modified.copyFrom(modified);
this.original.copyFrom(original);

View File

@@ -19,14 +19,14 @@
package org.isoron.uhabits.io;
import android.support.annotation.NonNull;
import android.support.annotation.*;
import org.isoron.uhabits.models.*;
import java.io.File;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import java.io.*;
import java.util.*;
import javax.inject.*;
/**
* A GenericImporter decides which implementation of AbstractImporter is able to
@@ -36,14 +36,19 @@ public class GenericImporter extends AbstractImporter
{
List<AbstractImporter> importers;
public GenericImporter(HabitList habits)
@Inject
public GenericImporter(@NonNull HabitList habits,
@NonNull LoopDBImporter loopDBImporter,
@NonNull RewireDBImporter rewireDBImporter,
@NonNull TickmateDBImporter tickmateDBImporter,
@NonNull HabitBullCSVImporter habitBullCSVImporter)
{
super(habits);
importers = new LinkedList<>();
importers.add(new LoopDBImporter(habits));
importers.add(new RewireDBImporter(habits));
importers.add(new TickmateDBImporter(habits));
importers.add(new HabitBullCSVImporter(habits));
importers.add(loopDBImporter);
importers.add(rewireDBImporter);
importers.add(tickmateDBImporter);
importers.add(habitBullCSVImporter);
}
@Override

View File

@@ -19,30 +19,32 @@
package org.isoron.uhabits.io;
import android.support.annotation.NonNull;
import android.support.annotation.*;
import com.activeandroid.ActiveAndroid;
import com.opencsv.CSVReader;
import com.activeandroid.*;
import com.opencsv.*;
import org.isoron.uhabits.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.utils.DateUtils;
import org.isoron.uhabits.utils.*;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Calendar;
import java.util.HashMap;
import java.io.*;
import java.util.*;
import javax.inject.*;
/**
* Class that imports data from HabitBull CSV files.
*/
public class HabitBullCSVImporter extends AbstractImporter
{
public HabitBullCSVImporter(HabitList habits)
private ModelFactory modelFactory;
@Inject
public HabitBullCSVImporter(@NonNull HabitList habits,
@NonNull ModelFactory modelFactory)
{
super(habits);
this.modelFactory = modelFactory;
}
@Override
@@ -97,7 +99,7 @@ public class HabitBullCSVImporter extends AbstractImporter
if(h == null)
{
h = new Habit();
h = modelFactory.buildHabit();
h.setName(name);
h.setDescription(description);
h.setFrequency(Frequency.DAILY);

View File

@@ -32,12 +32,15 @@ import org.isoron.uhabits.utils.FileUtils;
import java.io.File;
import java.io.IOException;
import javax.inject.*;
/**
* Class that imports data from database files exported by Loop Habit Tracker.
*/
public class LoopDBImporter extends AbstractImporter
{
public LoopDBImporter(HabitList habits)
@Inject
public LoopDBImporter(@NonNull HabitList habits)
{
super(habits);
}

View File

@@ -23,7 +23,6 @@ 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.*;
@@ -31,14 +30,23 @@ import org.isoron.uhabits.utils.*;
import java.io.*;
import java.util.*;
import javax.inject.*;
import static android.database.sqlite.SQLiteDatabase.*;
/**
* Class that imports database files exported by Rewire.
*/
public class RewireDBImporter extends AbstractImporter
{
public RewireDBImporter(HabitList habits)
private ModelFactory modelFactory;
@Inject
public RewireDBImporter(@NonNull HabitList habits,
@NonNull ModelFactory modelFactory)
{
super(habits);
this.modelFactory = modelFactory;
}
@Override
@@ -46,8 +54,7 @@ public class RewireDBImporter extends AbstractImporter
{
if (!isSQLite3File(file)) return false;
SQLiteDatabase db = SQLiteDatabase.openDatabase(file.getPath(), null,
SQLiteDatabase.OPEN_READONLY);
SQLiteDatabase db = openDatabase(file.getPath(), null, OPEN_READONLY);
Cursor c = db.rawQuery(
"select count(*) from SQLITE_MASTER where name=? or name=?",
@@ -63,19 +70,10 @@ public class RewireDBImporter extends AbstractImporter
@Override
public void importHabitsFromFile(@NonNull File file) throws IOException
{
final SQLiteDatabase db =
SQLiteDatabase.openDatabase(file.getPath(), null,
SQLiteDatabase.OPEN_READONLY);
DatabaseUtils.executeAsTransaction(new DatabaseUtils.Callback()
{
@Override
public void execute()
{
createHabits(db);
}
});
String path = file.getPath();
final SQLiteDatabase db = openDatabase(path, null, OPEN_READONLY);
DatabaseUtils.executeAsTransaction(() -> createHabits(db));
db.close();
}
@@ -134,7 +132,7 @@ public class RewireDBImporter extends AbstractImporter
int days = c.getInt(6);
int periodIndex = c.getInt(7);
Habit habit = new Habit();
Habit habit = modelFactory.buildHabit();
habit.setName(name);
habit.setDescription(description);

View File

@@ -30,14 +30,21 @@ import org.isoron.uhabits.utils.*;
import java.io.*;
import java.util.*;
import javax.inject.*;
/**
* Class that imports data from database files exported by Tickmate.
*/
public class TickmateDBImporter extends AbstractImporter
{
public TickmateDBImporter(HabitList habits)
private ModelFactory modelFactory;
@Inject
public TickmateDBImporter(@NonNull HabitList habits,
@NonNull ModelFactory modelFactory)
{
super(habits);
this.modelFactory = modelFactory;
}
@Override
@@ -118,7 +125,7 @@ public class TickmateDBImporter extends AbstractImporter
String name = c.getString(1);
String description = c.getString(2);
Habit habit = new Habit();
Habit habit = modelFactory.buildHabit();
habit.setName(name);
habit.setDescription(description);
habit.setFrequency(Frequency.DAILY);

View File

@@ -23,7 +23,6 @@ import android.net.*;
import android.support.annotation.*;
import org.apache.commons.lang3.builder.*;
import org.isoron.uhabits.*;
import java.util.*;
@@ -78,23 +77,8 @@ public class Habit
* The habit is not archived, not highlighted, has no reminders and is
* placed in the last position of the list of habits.
*/
@Deprecated
public Habit()
{
this.color = 5;
this.archived = false;
this.frequency = new Frequency(3, 7);
ModelFactory factory =
HabitsApplication.getStaticComponent().getModelFactory();
checkmarks = factory.buildCheckmarkList(this);
streaks = factory.buildStreakList(this);
scores = factory.buildScoreList(this);
repetitions = factory.buildRepetitionList(this);
}
@Inject
public Habit(@NonNull ModelFactory factory)
Habit(@NonNull ModelFactory factory)
{
this.color = 5;
this.archived = false;

View File

@@ -39,9 +39,9 @@ public class SQLModelFactory implements ModelFactory
@Provides
@Singleton
static HabitList provideHabitList()
public static HabitList provideHabitList()
{
return SQLiteHabitList.getInstance();
return SQLiteHabitList.getInstance(provideModelFactory());
}
@Override
@@ -53,7 +53,7 @@ public class SQLModelFactory implements ModelFactory
@Override
public HabitList buildHabitList()
{
return SQLiteHabitList.getInstance();
return SQLiteHabitList.getInstance(provideModelFactory());
}
@Override

View File

@@ -35,38 +35,34 @@ import java.util.*;
*/
public class SQLiteHabitList extends HabitList
{
private static SQLiteHabitList instance;
private static HashMap<Long, Habit> cache;
private static SQLiteHabitList instance;
private final SQLiteUtils<HabitRecord> sqlite;
protected SQLiteHabitList()
private ModelFactory modelFactory;
public SQLiteHabitList(@NonNull ModelFactory modelFactory)
{
super();
if(cache == null) cache = new HashMap<>();
this.modelFactory = modelFactory;
if (cache == null) cache = new HashMap<>();
sqlite = new SQLiteUtils<>(HabitRecord.class);
}
protected SQLiteHabitList(
@NonNull org.isoron.uhabits.models.HabitMatcher filter)
protected SQLiteHabitList(@NonNull HabitMatcher filter)
{
super(filter);
if(cache == null) cache = new HashMap<>();
if (cache == null) cache = new HashMap<>();
sqlite = new SQLiteUtils<>(HabitRecord.class);
}
/**
* Returns the global list of habits.
* <p>
* There is only one list of habit per application, corresponding to the
* habits table of the SQLite database.
*
* @return the global list of habits.
*/
public static SQLiteHabitList getInstance()
public static SQLiteHabitList getInstance(
@NonNull ModelFactory modelFactory)
{
if (instance == null) instance = new SQLiteHabitList();
if (instance == null) instance = new SQLiteHabitList(modelFactory);
return instance;
}
@@ -84,7 +80,7 @@ public class SQLiteHabitList extends HabitList
if (id == null) id = record.save();
else record.save(id);
if(id < 0)
if (id < 0)
throw new IllegalArgumentException("habit could not be saved");
habit.setId(id);
@@ -100,7 +96,7 @@ public class SQLiteHabitList extends HabitList
HabitRecord record = HabitRecord.get(id);
if (record == null) return null;
Habit habit = new Habit();
Habit habit = modelFactory.buildHabit();
record.copyTo(habit);
cache.put(id, habit);
}
@@ -117,7 +113,7 @@ public class SQLiteHabitList extends HabitList
@NonNull
@Override
public HabitList getFiltered(org.isoron.uhabits.models.HabitMatcher filter)
public HabitList getFiltered(HabitMatcher filter)
{
return new SQLiteHabitList(filter);
}
@@ -184,13 +180,16 @@ public class SQLiteHabitList extends HabitList
HabitRecord fromRecord = HabitRecord.get(from.getId());
HabitRecord toRecord = HabitRecord.get(to.getId());
if (fromRecord == null) throw new RuntimeException("habit not in database");
if (toRecord == null) throw new RuntimeException("habit not in database");
if (fromRecord == null)
throw new RuntimeException("habit not in database");
if (toRecord == null)
throw new RuntimeException("habit not in database");
Integer fromPos = fromRecord.position;
Integer toPos = toRecord.position;
Log.d("SQLiteHabitList", String.format("reorder: %d %d", fromPos, toPos));
Log.d("SQLiteHabitList",
String.format("reorder: %d %d", fromPos, toPos));
if (toPos < fromPos)
{
@@ -246,7 +245,7 @@ public class SQLiteHabitList extends HabitList
if (habit == null)
throw new RuntimeException("habit not in database");
if(!filter.matches(habit)) continue;
if (!filter.matches(habit)) continue;
habits.add(habit);
}
@@ -269,7 +268,7 @@ public class SQLiteHabitList extends HabitList
if (filter.isReminderRequired()) where.add("reminder_hour is not null");
if (!filter.isArchivedAllowed()) where.add("archived = 0");
if(where.isEmpty()) return;
if (where.isEmpty()) return;
query.append("where ");
query.append(StringUtils.join(where, " and "));
query.append(" ");

View File

@@ -25,7 +25,6 @@ import com.activeandroid.*;
import com.activeandroid.annotation.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.models.sqlite.*;
/**
* The SQLite database record corresponding to a {@link Checkmark}.
@@ -63,8 +62,6 @@ public class CheckmarkRecord extends Model implements SQLiteRecord
public Checkmark toCheckmark()
{
SQLiteHabitList habitList = SQLiteHabitList.getInstance();
Habit h = habitList.getById(habit.getId());
return new Checkmark(timestamp, value);
}
}

View File

@@ -25,7 +25,6 @@ import com.activeandroid.*;
import com.activeandroid.annotation.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.models.sqlite.*;
/**
* The SQLite database record corresponding to a {@link Repetition}.
@@ -57,8 +56,6 @@ public class RepetitionRecord extends Model implements SQLiteRecord
public Repetition toRepetition()
{
SQLiteHabitList habitList = SQLiteHabitList.getInstance();
Habit h = habitList.getById(habit.getId());
return new Repetition(timestamp);
}
}

View File

@@ -25,7 +25,6 @@ import com.activeandroid.*;
import com.activeandroid.annotation.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.models.sqlite.*;
/**
* The SQLite database record corresponding to a Score.
@@ -63,8 +62,6 @@ public class ScoreRecord extends Model implements SQLiteRecord
*/
public Score toScore()
{
SQLiteHabitList habitList = SQLiteHabitList.getInstance();
Habit h = habitList.getById(habit.getId());
return new Score(timestamp, score);
}
}

View File

@@ -25,7 +25,6 @@ import com.activeandroid.*;
import com.activeandroid.annotation.*;
import org.isoron.uhabits.models.*;
import org.isoron.uhabits.models.sqlite.*;
import java.lang.reflect.*;
@@ -86,8 +85,6 @@ public class StreakRecord extends Model implements SQLiteRecord
public Streak toStreak()
{
SQLiteHabitList habitList = SQLiteHabitList.getInstance();
Habit h = habitList.getById(habit.getId());
return new Streak(start, end);
}
}

View File

@@ -21,11 +21,13 @@ 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 java.io.*;
@AutoFactory
public class ImportDataTask implements Task
{
public static final int FAILED = 3;
@@ -39,18 +41,17 @@ public class ImportDataTask implements Task
@NonNull
private final File file;
private GenericImporter importer;
@NonNull
private final Listener listener;
@NonNull
private final HabitList habits;
public ImportDataTask(@NonNull HabitList habits,
public ImportDataTask(@Provided @NonNull GenericImporter importer,
@NonNull File file,
@NonNull Listener listener)
{
this.importer = importer;
this.listener = listener;
this.habits = habits;
this.file = file;
}
@@ -59,7 +60,6 @@ public class ImportDataTask implements Task
{
try
{
GenericImporter importer = new GenericImporter(habits);
if (importer.canHandle(file))
{
importer.importHabitsFromFile(file);