diff --git a/app/build.gradle b/app/build.gradle deleted file mode 100644 index 41f43d75c..000000000 --- a/app/build.gradle +++ /dev/null @@ -1,147 +0,0 @@ -apply plugin: 'com.android.application' -apply plugin: 'com.neenbedankt.android-apt' -apply plugin: 'me.tatarka.retrolambda' -apply plugin: 'jacoco' - -android { - compileSdkVersion 25 - buildToolsVersion "25.0.2" - - defaultConfig { - applicationId "org.isoron.uhabits" - minSdkVersion 19 - targetSdkVersion 25 - - buildConfigField "Integer", "databaseVersion", "19" - buildConfigField "String", "databaseFilename", "\"uhabits.db\"" - buildConfigField "int", "roboSdk", (System.getenv("ROBO_SDK")?: "25") - - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - testInstrumentationRunnerArgument "size", "medium" - } - - buildTypes { - release { - minifyEnabled true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' - } - debug { - testCoverageEnabled = true - } - } - - lintOptions { - checkReleaseBuilds false - } - - compileOptions { - targetCompatibility 1.8 - sourceCompatibility 1.8 - } - - testOptions { - unitTests.all { - testLogging { - events "passed", "skipped", "failed", "standardOut", "standardError" - outputs.upToDateWhen { false } - showStandardStreams = true - } - jacoco { - includeNoLocationClasses = true - } - } - } -} - -dependencies { - - androidTestApt 'com.google.dagger:dagger-compiler:2.11-rc2' - - androidTestCompile 'com.android.support:support-annotations:25.3.1' - androidTestCompile 'com.android.support.test:rules:0.5' - androidTestCompile 'com.android.support.test:runner:0.5' - androidTestCompile 'com.google.auto.factory:auto-factory:1.0-beta3' - androidTestCompile "com.google.dexmaker:dexmaker:1.2" - androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.2' - androidTestCompile 'org.mockito:mockito-core:1.10.19' - androidTestCompile 'com.google.guava:guava:20.0' - - apt 'com.google.dagger:dagger-compiler:2.11-rc2' - apt 'com.jakewharton:butterknife-compiler:8.6.1-SNAPSHOT' - - compile 'com.android.support:appcompat-v7:25.3.1' - compile 'com.android.support:design:25.3.1' - compile 'com.android.support:preference-v14:25.3.1' - compile 'com.android.support:support-v4:25.3.1' - compile 'com.getpebble:pebblekit:3.0.0' - compile 'com.github.paolorotolo:appintro:3.4.0' - compile 'com.google.auto.factory:auto-factory:1.0-beta3' - compile 'com.google.dagger:dagger:2.11-rc2' - compile 'com.jakewharton:butterknife:8.6.1-SNAPSHOT' - compile 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT' - compile 'com.opencsv:opencsv:3.9' - compile 'org.apmem.tools:layouts:1.10' - compile 'org.jetbrains:annotations-java5:15.0' - compile 'com.google.code.gson:gson:2.7' - compile 'com.google.code.findbugs:jsr305:3.0.2' - compile 'com.google.guava:guava:20.0' - - provided 'javax.annotation:jsr250-api:1.0' - - compile ('io.socket:socket.io-client:+') { - exclude group: 'org.json', module: 'json' - } - - testApt 'com.google.dagger:dagger-compiler:2.11-rc2' - testApt 'com.google.guava:guava:20.0' - - testCompile 'junit:junit:5.0-SNAPSHOT' - testCompile 'org.hamcrest:hamcrest-library:1.4-atlassian-1' - testCompile 'org.mockito:mockito-core:2.8.9' - testCompile 'org.json:json:20160810' - testCompile 'org.robolectric:robolectric:3.4-rc2' -} - -retrolambda { - defaultMethods true -} - -jacoco { - toolVersion = "0.7.6.201602180812" -} - -task coverageReport(type: JacocoReport, dependsOn: ['testDebugUnitTest']) { - - jacocoClasspath = configurations['androidJacocoAnt'] - - reports { - html.enabled = true - xml.enabled = true - } - - def excludes = [ - '**/R.class', - '**/R$*.class', - '**/BuildConfig.*', - '**/Manifest*', - '**/*Test*.*', - '**/*$Lambda$*', - '**/*$ViewBinder*', - '**/*MembersInjector*', - '**/*_Provide*', - '**/*Module_*', - '**/com/android/**/*', - 'android/**/*', - '**/*Dagger*', - '**/*_Factory*' - ] - - def srcDir = "${project.projectDir}/src/main/java" - def classDir = "${buildDir}/intermediates/classes/debug" - def jvmExecData = "${buildDir}/jacoco/testDebugUnitTest.exec" - def connectedExecData = "${buildDir}/outputs/code-coverage/connected/coverage.ec" - - sourceDirectories = files(srcDir) - classDirectories = files(fileTree(dir: classDir, excludes: excludes)) - executionData = files(jvmExecData, connectedExecData) -} diff --git a/app/src/main/java/org/isoron/uhabits/utils/WidgetUtils.java b/app/src/main/java/org/isoron/uhabits/utils/WidgetUtils.java deleted file mode 100644 index ab55d0b9a..000000000 --- a/app/src/main/java/org/isoron/uhabits/utils/WidgetUtils.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * 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.utils; - -import android.appwidget.*; -import android.content.*; -import android.os.*; -import android.support.annotation.*; -import android.widget.*; - -import org.isoron.uhabits.widgets.*; - -import static android.appwidget.AppWidgetManager.*; -import static org.isoron.uhabits.utils.InterfaceUtils.*; - -public abstract class WidgetUtils -{ - @NonNull - public static WidgetDimensions getDimensionsFromOptions( - @NonNull Context ctx, @NonNull Bundle options) - { - int maxWidth = - (int) dpToPixels(ctx, options.getInt(OPTION_APPWIDGET_MAX_WIDTH)); - int maxHeight = - (int) dpToPixels(ctx, options.getInt(OPTION_APPWIDGET_MAX_HEIGHT)); - int minWidth = - (int) dpToPixels(ctx, options.getInt(OPTION_APPWIDGET_MIN_WIDTH)); - int minHeight = - (int) dpToPixels(ctx, options.getInt(OPTION_APPWIDGET_MIN_HEIGHT)); - - return new WidgetDimensions(minWidth, maxHeight, maxWidth, minHeight); - } - - public static void updateAppWidget(@NonNull AppWidgetManager manager, - @NonNull BaseWidget widget) - { - RemoteViews landscape = widget.getLandscapeRemoteViews(); - RemoteViews portrait = widget.getPortraitRemoteViews(); - RemoteViews views = new RemoteViews(landscape, portrait); - manager.updateAppWidget(widget.getId(), views); - } -} diff --git a/app/src/test/java/org/isoron/uhabits/activities/BaseActivityTest.java b/app/src/test/java/org/isoron/uhabits/activities/BaseActivityTest.java deleted file mode 100644 index cf3050970..000000000 --- a/app/src/test/java/org/isoron/uhabits/activities/BaseActivityTest.java +++ /dev/null @@ -1,199 +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; - -import android.content.*; -import android.os.*; -import android.support.v4.app.*; -import android.support.v7.app.*; -import android.support.v7.widget.Toolbar; -import android.view.*; -import android.widget.*; - -import org.isoron.uhabits.*; -import org.isoron.uhabits.activities.common.dialogs.*; -import org.junit.*; -import org.junit.runner.*; -import org.robolectric.*; -import org.robolectric.annotation.*; -import org.robolectric.shadows.*; - -import static org.hamcrest.core.IsEqual.*; -import static org.junit.Assert.*; -import static org.mockito.Mockito.*; -import static org.robolectric.Robolectric.*; -import static org.robolectric.Shadows.*; - -@RunWith(RobolectricTestRunner.class) -@Config(sdk = BuildConfig.roboSdk, constants = BuildConfig.class) -public class BaseActivityTest -{ - private static boolean hasCrashed = false; - - @Test - public void activityResultTest() - { - ScreenActivity activity = spy(setupActivity(ScreenActivity.class)); - activity.onActivityResult(0, 0, null); - verify(activity.screen).onResult(0, 0, null); - } - - @Test - public void componentTest() - { - EmptyActivity activity = setupActivity(EmptyActivity.class); - ActivityComponent component = activity.getComponent(); - assertThat(component.getActivity(), equalTo(activity)); - } - - @Test - public void dialogFragmentTest() - { - EmptyActivity activity = setupActivity(EmptyActivity.class); - FragmentManager manager = activity.getSupportFragmentManager(); - ColorPickerDialog d = new ColorPickerDialogFactory(activity).create(0); - - activity.showDialog(d, "picker"); - assertTrue(d.getDialog().isShowing()); - assertThat(d, equalTo(manager.findFragmentByTag("picker"))); - } - - @Test - public void dialogTest() - { - EmptyActivity activity = setupActivity(EmptyActivity.class); - AlertDialog dialog = - new AlertDialog.Builder(activity).setTitle("Hello world").create(); - - activity.showDialog(dialog); - assertTrue(dialog.isShowing()); - } - - @Test - public void restartTest() throws Exception - { - EmptyActivity activity = setupActivity(EmptyActivity.class); - - activity.restartWithFade(EmptyActivity.class); - ShadowLooper.runUiThreadTasksIncludingDelayedTasks(); - - Intent nextStartedActivity = shadowOf(activity).getNextStartedActivity(); - assertNotNull(nextStartedActivity); - - assertTrue(activity.isFinishing()); - assertThat(shadowOf(nextStartedActivity).getIntentClass(), - equalTo(EmptyActivity.class)); - } - - @Test - public void exceptionHandlerTest() throws InterruptedException - { - assertFalse(hasCrashed); - - Thread crashThread = new Thread() - { - @Override - public void run() - { - Looper.prepare(); - CrashActivity activity = setupActivity(CrashActivity.class); - activity.crash(); - } - }; - - crashThread.start(); - crashThread.join(); - assertTrue(hasCrashed); - } - - @Test - public void menuTest() - { - MenuActivity activity = setupActivity(MenuActivity.class); - verify(activity.baseMenu).onCreate(eq(activity.getMenuInflater()), - any()); - - Menu menu = activity.toolbar.getMenu(); - MenuItem item = menu.getItem(0); - activity.onMenuItemSelected(0, item); - verify(activity.baseMenu).onItemSelected(item); - } - - static class CrashActivity extends BaseActivity - { - public void crash() - { - throw new RuntimeException("crash!"); - } - - @Override - protected Thread.UncaughtExceptionHandler getExceptionHandler() - { - return (t, e) -> hasCrashed = true; - } - } - - static class EmptyActivity extends BaseActivity - { - - } - - static class MenuActivity extends BaseActivity - { - public BaseMenu baseMenu; - - public Toolbar toolbar; - - @Override - protected void onCreate(Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); - toolbar = new Toolbar(this); - LinearLayout layout = new LinearLayout(this); - layout.addView(toolbar); - setContentView(layout); - setSupportActionBar(toolbar); - - baseMenu = spy(new BaseMenu(this) - { - @Override - protected int getMenuResourceId() - { - return R.menu.list_habits; - } - }); - - setBaseMenu(baseMenu); - } - } - - static class ScreenActivity extends BaseActivity - { - private BaseScreen screen; - - @Override - protected void onCreate(Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); - screen = spy(new BaseScreen(this)); - setScreen(screen); - } - } -} diff --git a/app/src/test/java/org/isoron/uhabits/activities/BaseScreenTest.java b/app/src/test/java/org/isoron/uhabits/activities/BaseScreenTest.java deleted file mode 100644 index f087aca4d..000000000 --- a/app/src/test/java/org/isoron/uhabits/activities/BaseScreenTest.java +++ /dev/null @@ -1,140 +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; - -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(sdk = BuildConfig.roboSdk, 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 - { - - } -} diff --git a/app/src/test/java/org/isoron/uhabits/activities/habits/list/ListHabitsControllerTest.java b/app/src/test/java/org/isoron/uhabits/activities/habits/list/ListHabitsControllerTest.java deleted file mode 100644 index 74b71a74b..000000000 --- a/app/src/test/java/org/isoron/uhabits/activities/habits/list/ListHabitsControllerTest.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * 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.activities.habits.list; - -import org.isoron.uhabits.*; -import org.isoron.uhabits.activities.*; -import org.isoron.uhabits.activities.habits.list.model.*; -import org.isoron.uhabits.commands.*; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.preferences.*; -import org.isoron.uhabits.tasks.*; -import org.isoron.uhabits.utils.*; -import org.isoron.uhabits.widgets.*; -import org.junit.*; - -import static org.mockito.Mockito.*; - -public class ListHabitsControllerTest extends BaseUnitTest -{ - - private ListHabitsController controller; - - private ImportDataTaskFactory importTaskFactory; - - private BaseSystem system; - - private CommandRunner commandRunner; - - private HabitCardListAdapter adapter; - - private ListHabitsScreen screen; - - private Preferences prefs; - - private ReminderScheduler reminderScheduler; - - private SingleThreadTaskRunner taskRunner; - - private WidgetUpdater widgetUpdater; - - private ExportCSVTaskFactory exportCSVFactory; - - private ExportDBTaskFactory exportDBFactory; - - @Override - public void setUp() - { - super.setUp(); - - habitList = mock(HabitList.class); - system = mock(BaseSystem.class); - commandRunner = mock(CommandRunner.class); - adapter = mock(HabitCardListAdapter.class); - screen = mock(ListHabitsScreen.class); - prefs = mock(Preferences.class); - reminderScheduler = mock(ReminderScheduler.class); - taskRunner = new SingleThreadTaskRunner(); - widgetUpdater = mock(WidgetUpdater.class); - importTaskFactory = mock(ImportDataTaskFactory.class); - exportCSVFactory = mock(ExportCSVTaskFactory.class); - exportDBFactory = mock(ExportDBTaskFactory.class); - - controller = - spy(new ListHabitsController(system, commandRunner, habitList, - adapter, screen, prefs, reminderScheduler, taskRunner, - widgetUpdater, importTaskFactory, exportCSVFactory, exportDBFactory)); - } - - @Test - public void testOnHabitClick() - { - Habit h = mock(Habit.class); - controller.onHabitClick(h); - verify(screen).showHabitScreen(h); - } - - @Test - public void testOnHabitReorder() - { - Habit from = mock(Habit.class); - Habit to = mock(Habit.class); - controller.onHabitReorder(from, to); - verify(habitList).reorder(from, to); - } - - @Test - public void onInvalidToggle() - { - controller.onInvalidToggle(); - verify(screen).showMessage(R.string.long_press_to_toggle); - } - - @Test - public void onStartup_notFirstLaunch() - { - when(prefs.isFirstRun()).thenReturn(false); - controller.onStartup(); - verify(prefs).incrementLaunchCount(); - } - - @Test - public void onStartup_firstLaunch() - { - long today = DateUtils.getStartOfToday(); - - when(prefs.isFirstRun()).thenReturn(true); - controller.onStartup(); - verify(prefs).setFirstRun(false); - verify(prefs).updateLastHint(-1, today); - verify(screen).showIntroScreen(); - } -} \ No newline at end of file diff --git a/app/src/test/java/org/isoron/uhabits/activities/habits/show/ShowHabitsMenuTest.java b/app/src/test/java/org/isoron/uhabits/activities/habits/show/ShowHabitsMenuTest.java deleted file mode 100644 index 90cfdf512..000000000 --- a/app/src/test/java/org/isoron/uhabits/activities/habits/show/ShowHabitsMenuTest.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * 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.activities.habits.show; - -import android.view.*; - -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 BaseUnitTest -{ - private ShowHabitActivity activity; - - private ShowHabitScreen screen; - - private ShowHabitsMenu menu; - - private Habit habit; - - private ExportCSVTaskFactory exportCSVFactory; - - private TaskRunner taskRunner; - - private ExportCSVTask task; - - @Override - public void setUp() - { - super.setUp(); - activity = mock(ShowHabitActivity.class); - screen = mock(ShowHabitScreen.class); - habit = mock(Habit.class); - exportCSVFactory = mock(ExportCSVTaskFactory.class); - taskRunner = mock(TaskRunner.class); - menu = new ShowHabitsMenu(activity, 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/build.gradle b/build.gradle index 16e4df7a8..9cc9777e4 100644 --- a/build.gradle +++ b/build.gradle @@ -1,21 +1,22 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { jcenter() + maven { url 'https://maven.google.com' } } dependencies { - classpath 'com.android.tools.build:gradle:2.3.2' + classpath 'com.android.tools.build:gradle:3.0.0-alpha2' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.6.4' - classpath 'me.tatarka:gradle-retrolambda:3.2.5' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' + classpath 'org.jacoco:org.jacoco.core:+' } } allprojects { repositories { jcenter() + maven { url 'https://maven.google.com' } maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } } } diff --git a/build.sh b/build.sh index d14961bfc..15d46f661 100755 --- a/build.sh +++ b/build.sh @@ -19,7 +19,7 @@ ADB="${ANDROID_HOME}/platform-tools/adb" EMULATOR="${ANDROID_HOME}/tools/emulator" GRADLE="./gradlew --stacktrace" PACKAGE_NAME=org.isoron.uhabits -OUTPUTS_DIR=app/build/outputs +OUTPUTS_DIR=uhabits-android/build/outputs KEYFILE="TestKeystore.jks" KEY_ALIAS="default" @@ -120,6 +120,12 @@ uninstall_apk() { $ADB uninstall ${PACKAGE_NAME} } +install_test_butler() { + log_info "Installing Test Butler" + $ADB install tools/test-butler-app-1.3.1.apk + $ADB uninstall com.linkedin.android.testbutler +} + install_apk() { if [ ! -z $UNINSTALL_FIRST ]; then uninstall_apk @@ -128,14 +134,14 @@ install_apk() { log_info "Installing APK" if [ ! -z $RELEASE ]; then - $ADB install -r ${OUTPUTS_DIR}/apk/app-release.apk || fail + $ADB install -r ${OUTPUTS_DIR}/apk/release/uhabits-android-release.apk || fail else - $ADB install -r ${OUTPUTS_DIR}/apk/app-debug.apk || fail + $ADB install -r ${OUTPUTS_DIR}/apk/debug/uhabits-android-debug.apk || fail fi } install_test_apk() { - $ADB install -r ${OUTPUTS_DIR}/apk/app-debug-androidTest.apk || fail + $ADB install -r ${OUTPUTS_DIR}/apk/androidTest/debug/uhabits-android-debug-androidTest.apk || fail } run_instrumented_tests() { @@ -143,7 +149,7 @@ run_instrumented_tests() { $ADB shell am instrument \ -r -e coverage true -e size medium \ -w ${PACKAGE_NAME}.test/android.support.test.runner.AndroidJUnitRunner \ - > ${OUTPUTS_DIR}/instrument.txt + | tee ${OUTPUTS_DIR}/instrument.txt mkdir -p ${OUTPUTS_DIR}/code-coverage/connected/ $ADB pull /data/user/0/${PACKAGE_NAME}/files/coverage.ec \ @@ -157,8 +163,12 @@ parse_instrumentation_results() { } generate_coverage_badge() { - log_info "Generating code coverage badge" - python tools/coverage-badge/badge.py -i app/build/reports/jacoco/coverageReport/coverageReport.xml -o ${OUTPUTS_DIR}/coverage-badge + log_info "Generating code coverage report and badge" + $GRADLE coverageReport || fail + + ANDROID_REPORT=uhabits-android/build/reports/jacoco/coverageReport/coverageReport.xml + CORE_REPORT=uhabits-core/build/reports/jacoco/test/jacocoTestReport.xml + python tools/coverage-badge/badge.py -i $ANDROID_REPORT:$CORE_REPORT -o ${OUTPUTS_DIR}/coverage-badge } fetch_artifacts() { @@ -180,7 +190,7 @@ fetch_logcat() { run_jvm_tests() { log_info "Running JVM tests" - $GRADLE --no-daemon coverageReport || fail + $GRADLE testDebugUnitTest :uhabits-core:check || fail } uninstall_test_apk() { @@ -193,6 +203,7 @@ run_local_tests() { run_adb_as_root build_apk build_instrumentation_apk + install_test_butler install_apk install_test_apk run_instrumented_tests diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ba0e730da..4d42a9f55 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Mar 17 21:42:38 EDT 2017 +#Wed May 24 19:36:48 EDT 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.5-all.zip +distributionUrl=https\://services.gradle.org/distributions-snapshots/gradle-4.0-20170417000025+0000-all.zip diff --git a/settings.gradle b/settings.gradle index e7b4def49..10106d3ee 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':app' +include ':uhabits-android', ':uhabits-core' diff --git a/tools/coverage-badge/badge.py b/tools/coverage-badge/badge.py index 3d64e3247..08d8733e7 100644 --- a/tools/coverage-badge/badge.py +++ b/tools/coverage-badge/badge.py @@ -44,10 +44,13 @@ class Devnull(object): def get_total(report): - doc = BeautifulSoup(file(report), 'xml') - tag = doc.select("report > counter[type^INST]")[0] - missed = float(tag['missed']) - covered = float(tag['covered']) + missed = 0 + covered = 0 + for r in report.split(":"): + doc = BeautifulSoup(file(r), 'xml') + tag = doc.select("report > counter[type^INST]")[0] + missed = missed + float(tag['missed']) + covered = covered + float(tag['covered']) return str(int(round(100 * covered / (missed + covered)))) def get_color(total): diff --git a/tools/test-butler-app-1.3.1.apk b/tools/test-butler-app-1.3.1.apk new file mode 100644 index 000000000..c17cabad5 Binary files /dev/null and b/tools/test-butler-app-1.3.1.apk differ diff --git a/uhabits-android/build.gradle b/uhabits-android/build.gradle new file mode 100644 index 000000000..0bf33ad84 --- /dev/null +++ b/uhabits-android/build.gradle @@ -0,0 +1,145 @@ +apply plugin: 'idea' +apply plugin: 'com.android.application' +apply plugin: 'jacoco' + +android { + compileSdkVersion 25 + buildToolsVersion "25.0.2" + + defaultConfig { + applicationId "org.isoron.uhabits" + minSdkVersion 19 + targetSdkVersion 25 + + buildConfigField "Integer", "databaseVersion", "19" + buildConfigField "String", "databaseFilename", "\"uhabits.db\"" + buildConfigField "int", "roboSdk", (System.getenv("ROBO_SDK") ?: "25") + + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled true + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' + } + debug { + testCoverageEnabled true + } + } + + lintOptions { + checkReleaseBuilds false + } + + compileOptions { + targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_1_8 + } + + testOptions { + unitTests.all { + testLogging { + events "passed", "skipped", "failed", "standardOut", "standardError" + outputs.upToDateWhen { false } + showStandardStreams = true + } + jacoco { + includeNoLocationClasses = true + } + } + } +} + +dependencies { + implementation project(":uhabits-core") + implementation 'com.android.support:appcompat-v7:25.3.1' + implementation 'com.android.support:design:25.3.1' + implementation 'com.android.support:preference-v14:25.3.1' + implementation 'com.android.support:support-v4:25.3.1' + implementation 'com.getpebble:pebblekit:3.0.0' + implementation 'com.github.paolorotolo:appintro:3.4.0' + implementation 'com.google.dagger:dagger:2.9' + implementation 'com.jakewharton:butterknife:8.6.1-SNAPSHOT' + implementation 'com.michaelpardo:activeandroid:3.1.0-SNAPSHOT' + implementation 'org.apmem.tools:layouts:1.10' + implementation 'org.jetbrains:annotations-java5:15.0' + implementation 'com.google.code.gson:gson:2.7' + implementation 'com.google.code.findbugs:jsr305:3.0.2' + compileOnly 'javax.annotation:jsr250-api:1.0' + compileOnly 'com.google.auto.factory:auto-factory:1.0-beta3' + annotationProcessor 'com.google.dagger:dagger-compiler:2.9' + annotationProcessor 'com.jakewharton:butterknife-compiler:8.6.1-SNAPSHOT' + annotationProcessor 'com.google.auto.factory:auto-factory:1.0-beta3' + + androidTestImplementation project(":uhabits-core") + androidTestImplementation 'com.android.support:support-annotations:25.3.1' + androidTestImplementation 'com.android.support.test:rules:0.5' + androidTestImplementation 'com.android.support.test:runner:0.5' + androidTestImplementation 'com.google.guava:guava:20.0' + androidTestCompileOnly 'com.google.auto.factory:auto-factory:1.0-beta3' + androidTestAnnotationProcessor 'com.google.dagger:dagger-compiler:2.9' + androidTestAnnotationProcessor 'com.google.auto.factory:auto-factory:1.0-beta3' + androidTestAnnotationProcessor 'com.jakewharton:butterknife-compiler:8.6.1-SNAPSHOT' + + testAnnotationProcessor 'com.google.dagger:dagger-compiler:2.9' + testAnnotationProcessor 'com.google.auto.factory:auto-factory:1.0-beta3' + testAnnotationProcessor 'com.jakewharton:butterknife-compiler:8.6.1-SNAPSHOT' + + testCompile 'com.google.dagger:dagger:2.9' + testCompile "org.mockito:mockito-core:2.8.9" + testCompile "org.mockito:mockito-inline:2.8.9" + androidTestCompile 'com.google.dagger:dagger:2.9' + androidTestCompile "org.mockito:mockito-android:2.8.9" + androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2' + androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.1' + androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2' + androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.2.2' + androidTestCompile 'com.linkedin.testbutler:test-butler-library:1.3.1' + + implementation('com.opencsv:opencsv:3.9') { + exclude group: 'commons-logging', module: 'commons-logging' + } + implementation('io.socket:socket.io-client:+') { + exclude group: 'org.json', module: 'json' + } +} + +repositories { + mavenCentral() +} + +task coverageReport(type: JacocoReport) { + + jacocoClasspath = configurations['androidJacocoAnt'] + + reports { + html.enabled = true + xml.enabled = true + } + + def excludes = [ + '**/R.class', + '**/R$*.class', + '**/BuildConfig.*', + '**/Manifest*', + '**/*Test*.*', + '**/*$Lambda$*', + '**/*$ViewBinder*', + '**/*MembersInjector*', + '**/*_Provide*', + '**/*Module_*', + '**/com/android/**/*', + '**/*Dagger*', + '**/*_Factory*' + ] + + def androidSrc = "${project.projectDir}/src/main/java" + def androidClasses = "${buildDir}/intermediates/classes/debug" + def jvmExecData = "${buildDir}/jacoco/testDebugUnitTest.exec" + def connectedExecData = "${buildDir}/outputs/code-coverage/connected/coverage.ec" + + sourceDirectories = files(androidSrc) + classDirectories = files(fileTree(dir: androidClasses, excludes: excludes)) + executionData = files(jvmExecData, connectedExecData) +} \ No newline at end of file diff --git a/app/lint.xml b/uhabits-android/lint.xml similarity index 100% rename from app/lint.xml rename to uhabits-android/lint.xml diff --git a/app/proguard-rules.txt b/uhabits-android/proguard-rules.txt similarity index 100% rename from app/proguard-rules.txt rename to uhabits-android/proguard-rules.txt diff --git a/uhabits-android/src/androidTest/AndroidManifest.xml b/uhabits-android/src/androidTest/AndroidManifest.xml new file mode 100644 index 000000000..f5c89202e --- /dev/null +++ b/uhabits-android/src/androidTest/AndroidManifest.xml @@ -0,0 +1,27 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/androidTest/assets/habitbull.csv b/uhabits-android/src/androidTest/assets/habitbull.csv similarity index 100% rename from app/src/androidTest/assets/habitbull.csv rename to uhabits-android/src/androidTest/assets/habitbull.csv diff --git a/app/src/androidTest/assets/icon.png b/uhabits-android/src/androidTest/assets/icon.png similarity index 100% rename from app/src/androidTest/assets/icon.png rename to uhabits-android/src/androidTest/assets/icon.png diff --git a/app/src/androidTest/assets/loop.db b/uhabits-android/src/androidTest/assets/loop.db similarity index 100% rename from app/src/androidTest/assets/loop.db rename to uhabits-android/src/androidTest/assets/loop.db diff --git a/app/src/androidTest/assets/pull_failed b/uhabits-android/src/androidTest/assets/pull_failed similarity index 100% rename from app/src/androidTest/assets/pull_failed rename to uhabits-android/src/androidTest/assets/pull_failed diff --git a/app/src/androidTest/assets/rewire.db b/uhabits-android/src/androidTest/assets/rewire.db similarity index 100% rename from app/src/androidTest/assets/rewire.db rename to uhabits-android/src/androidTest/assets/rewire.db diff --git a/uhabits-android/src/androidTest/assets/test.db b/uhabits-android/src/androidTest/assets/test.db new file mode 100644 index 000000000..531903063 Binary files /dev/null and b/uhabits-android/src/androidTest/assets/test.db differ diff --git a/app/src/androidTest/assets/tickmate.db b/uhabits-android/src/androidTest/assets/tickmate.db similarity index 100% rename from app/src/androidTest/assets/tickmate.db rename to uhabits-android/src/androidTest/assets/tickmate.db diff --git a/app/src/androidTest/assets/views-v19/common/BarChart/render.png b/uhabits-android/src/androidTest/assets/views-v19/common/BarChart/render.png similarity index 100% rename from app/src/androidTest/assets/views-v19/common/BarChart/render.png rename to uhabits-android/src/androidTest/assets/views-v19/common/BarChart/render.png diff --git a/app/src/androidTest/assets/views-v19/common/BarChart/renderDataOffset.png b/uhabits-android/src/androidTest/assets/views-v19/common/BarChart/renderDataOffset.png similarity index 100% rename from app/src/androidTest/assets/views-v19/common/BarChart/renderDataOffset.png rename to uhabits-android/src/androidTest/assets/views-v19/common/BarChart/renderDataOffset.png diff --git a/app/src/androidTest/assets/views-v19/common/BarChart/renderDifferentSize.png b/uhabits-android/src/androidTest/assets/views-v19/common/BarChart/renderDifferentSize.png similarity index 100% rename from app/src/androidTest/assets/views-v19/common/BarChart/renderDifferentSize.png rename to uhabits-android/src/androidTest/assets/views-v19/common/BarChart/renderDifferentSize.png diff --git a/app/src/androidTest/assets/views-v19/common/BarChart/renderTransparent.png b/uhabits-android/src/androidTest/assets/views-v19/common/BarChart/renderTransparent.png similarity index 100% rename from app/src/androidTest/assets/views-v19/common/BarChart/renderTransparent.png rename to uhabits-android/src/androidTest/assets/views-v19/common/BarChart/renderTransparent.png diff --git a/app/src/androidTest/assets/views-v19/common/FrequencyChart/render.png b/uhabits-android/src/androidTest/assets/views-v19/common/FrequencyChart/render.png similarity index 100% rename from app/src/androidTest/assets/views-v19/common/FrequencyChart/render.png rename to uhabits-android/src/androidTest/assets/views-v19/common/FrequencyChart/render.png diff --git a/app/src/androidTest/assets/views-v19/common/FrequencyChart/renderDataOffset.png b/uhabits-android/src/androidTest/assets/views-v19/common/FrequencyChart/renderDataOffset.png similarity index 100% rename from app/src/androidTest/assets/views-v19/common/FrequencyChart/renderDataOffset.png rename to uhabits-android/src/androidTest/assets/views-v19/common/FrequencyChart/renderDataOffset.png diff --git a/app/src/androidTest/assets/views-v19/common/FrequencyChart/renderDifferentSize.png b/uhabits-android/src/androidTest/assets/views-v19/common/FrequencyChart/renderDifferentSize.png similarity index 100% rename from app/src/androidTest/assets/views-v19/common/FrequencyChart/renderDifferentSize.png rename to uhabits-android/src/androidTest/assets/views-v19/common/FrequencyChart/renderDifferentSize.png diff --git a/app/src/androidTest/assets/views-v19/common/FrequencyChart/renderTransparent.png b/uhabits-android/src/androidTest/assets/views-v19/common/FrequencyChart/renderTransparent.png similarity index 100% rename from app/src/androidTest/assets/views-v19/common/FrequencyChart/renderTransparent.png rename to uhabits-android/src/androidTest/assets/views-v19/common/FrequencyChart/renderTransparent.png diff --git a/app/src/androidTest/assets/views-v19/common/HistoryChart/render.png b/uhabits-android/src/androidTest/assets/views-v19/common/HistoryChart/render.png similarity index 100% rename from app/src/androidTest/assets/views-v19/common/HistoryChart/render.png rename to uhabits-android/src/androidTest/assets/views-v19/common/HistoryChart/render.png diff --git a/app/src/androidTest/assets/views-v19/common/HistoryChart/renderDataOffset.png b/uhabits-android/src/androidTest/assets/views-v19/common/HistoryChart/renderDataOffset.png similarity index 100% rename from app/src/androidTest/assets/views-v19/common/HistoryChart/renderDataOffset.png rename to uhabits-android/src/androidTest/assets/views-v19/common/HistoryChart/renderDataOffset.png diff --git a/app/src/androidTest/assets/views-v19/common/HistoryChart/renderDifferentSize.png b/uhabits-android/src/androidTest/assets/views-v19/common/HistoryChart/renderDifferentSize.png similarity index 100% rename from app/src/androidTest/assets/views-v19/common/HistoryChart/renderDifferentSize.png rename to uhabits-android/src/androidTest/assets/views-v19/common/HistoryChart/renderDifferentSize.png diff --git a/app/src/androidTest/assets/views-v19/common/HistoryChart/renderTransparent.png b/uhabits-android/src/androidTest/assets/views-v19/common/HistoryChart/renderTransparent.png similarity index 100% rename from app/src/androidTest/assets/views-v19/common/HistoryChart/renderTransparent.png rename to uhabits-android/src/androidTest/assets/views-v19/common/HistoryChart/renderTransparent.png diff --git a/app/src/androidTest/assets/views-v19/common/RingView/render.png b/uhabits-android/src/androidTest/assets/views-v19/common/RingView/render.png similarity index 100% rename from app/src/androidTest/assets/views-v19/common/RingView/render.png rename to uhabits-android/src/androidTest/assets/views-v19/common/RingView/render.png diff --git a/app/src/androidTest/assets/views-v19/common/RingView/renderDifferentParams.png b/uhabits-android/src/androidTest/assets/views-v19/common/RingView/renderDifferentParams.png similarity index 100% rename from app/src/androidTest/assets/views-v19/common/RingView/renderDifferentParams.png rename to uhabits-android/src/androidTest/assets/views-v19/common/RingView/renderDifferentParams.png diff --git a/app/src/androidTest/assets/views-v19/common/ScoreChart/render.png b/uhabits-android/src/androidTest/assets/views-v19/common/ScoreChart/render.png similarity index 100% rename from app/src/androidTest/assets/views-v19/common/ScoreChart/render.png rename to uhabits-android/src/androidTest/assets/views-v19/common/ScoreChart/render.png diff --git a/app/src/androidTest/assets/views-v19/common/ScoreChart/renderDataOffset.png b/uhabits-android/src/androidTest/assets/views-v19/common/ScoreChart/renderDataOffset.png similarity index 100% rename from app/src/androidTest/assets/views-v19/common/ScoreChart/renderDataOffset.png rename to uhabits-android/src/androidTest/assets/views-v19/common/ScoreChart/renderDataOffset.png diff --git a/app/src/androidTest/assets/views-v19/common/ScoreChart/renderDifferentSize.png b/uhabits-android/src/androidTest/assets/views-v19/common/ScoreChart/renderDifferentSize.png similarity index 100% rename from app/src/androidTest/assets/views-v19/common/ScoreChart/renderDifferentSize.png rename to uhabits-android/src/androidTest/assets/views-v19/common/ScoreChart/renderDifferentSize.png diff --git a/app/src/androidTest/assets/views-v19/common/ScoreChart/renderMonthly.png b/uhabits-android/src/androidTest/assets/views-v19/common/ScoreChart/renderMonthly.png similarity index 100% rename from app/src/androidTest/assets/views-v19/common/ScoreChart/renderMonthly.png rename to uhabits-android/src/androidTest/assets/views-v19/common/ScoreChart/renderMonthly.png diff --git a/app/src/androidTest/assets/views-v19/common/ScoreChart/renderTransparent.png b/uhabits-android/src/androidTest/assets/views-v19/common/ScoreChart/renderTransparent.png similarity index 100% rename from app/src/androidTest/assets/views-v19/common/ScoreChart/renderTransparent.png rename to uhabits-android/src/androidTest/assets/views-v19/common/ScoreChart/renderTransparent.png diff --git a/app/src/androidTest/assets/views-v19/common/ScoreChart/renderYearly.png b/uhabits-android/src/androidTest/assets/views-v19/common/ScoreChart/renderYearly.png similarity index 100% rename from app/src/androidTest/assets/views-v19/common/ScoreChart/renderYearly.png rename to uhabits-android/src/androidTest/assets/views-v19/common/ScoreChart/renderYearly.png diff --git a/app/src/androidTest/assets/views-v19/common/StreakChart/render.png b/uhabits-android/src/androidTest/assets/views-v19/common/StreakChart/render.png similarity index 100% rename from app/src/androidTest/assets/views-v19/common/StreakChart/render.png rename to uhabits-android/src/androidTest/assets/views-v19/common/StreakChart/render.png diff --git a/app/src/androidTest/assets/views-v19/common/StreakChart/renderSmallSize.png b/uhabits-android/src/androidTest/assets/views-v19/common/StreakChart/renderSmallSize.png similarity index 100% rename from app/src/androidTest/assets/views-v19/common/StreakChart/renderSmallSize.png rename to uhabits-android/src/androidTest/assets/views-v19/common/StreakChart/renderSmallSize.png diff --git a/app/src/androidTest/assets/views-v19/common/StreakChart/renderTransparent.png b/uhabits-android/src/androidTest/assets/views-v19/common/StreakChart/renderTransparent.png similarity index 100% rename from app/src/androidTest/assets/views-v19/common/StreakChart/renderTransparent.png rename to uhabits-android/src/androidTest/assets/views-v19/common/StreakChart/renderTransparent.png diff --git a/app/src/androidTest/assets/views-v19/habits/list/CheckmarkButtonView/render_explicit_check.png b/uhabits-android/src/androidTest/assets/views-v19/habits/list/CheckmarkButtonView/render_explicit_check.png similarity index 100% rename from app/src/androidTest/assets/views-v19/habits/list/CheckmarkButtonView/render_explicit_check.png rename to uhabits-android/src/androidTest/assets/views-v19/habits/list/CheckmarkButtonView/render_explicit_check.png diff --git a/app/src/androidTest/assets/views-v19/habits/list/CheckmarkButtonView/render_implicit_check.png b/uhabits-android/src/androidTest/assets/views-v19/habits/list/CheckmarkButtonView/render_implicit_check.png similarity index 100% rename from app/src/androidTest/assets/views-v19/habits/list/CheckmarkButtonView/render_implicit_check.png rename to uhabits-android/src/androidTest/assets/views-v19/habits/list/CheckmarkButtonView/render_implicit_check.png diff --git a/app/src/androidTest/assets/views-v19/habits/list/CheckmarkButtonView/render_unchecked.png b/uhabits-android/src/androidTest/assets/views-v19/habits/list/CheckmarkButtonView/render_unchecked.png similarity index 100% rename from app/src/androidTest/assets/views-v19/habits/list/CheckmarkButtonView/render_unchecked.png rename to uhabits-android/src/androidTest/assets/views-v19/habits/list/CheckmarkButtonView/render_unchecked.png diff --git a/app/src/androidTest/assets/views-v19/habits/list/CheckmarkPanelView/render.png b/uhabits-android/src/androidTest/assets/views-v19/habits/list/CheckmarkPanelView/render.png similarity index 100% rename from app/src/androidTest/assets/views-v19/habits/list/CheckmarkPanelView/render.png rename to uhabits-android/src/androidTest/assets/views-v19/habits/list/CheckmarkPanelView/render.png diff --git a/app/src/androidTest/assets/views-v19/habits/list/HabitCardView/render.png b/uhabits-android/src/androidTest/assets/views-v19/habits/list/HabitCardView/render.png similarity index 100% rename from app/src/androidTest/assets/views-v19/habits/list/HabitCardView/render.png rename to uhabits-android/src/androidTest/assets/views-v19/habits/list/HabitCardView/render.png diff --git a/app/src/androidTest/assets/views-v19/habits/list/HabitCardView/render_changed.png b/uhabits-android/src/androidTest/assets/views-v19/habits/list/HabitCardView/render_changed.png similarity index 100% rename from app/src/androidTest/assets/views-v19/habits/list/HabitCardView/render_changed.png rename to uhabits-android/src/androidTest/assets/views-v19/habits/list/HabitCardView/render_changed.png diff --git a/app/src/androidTest/assets/views-v19/habits/list/HabitCardView/render_selected.png b/uhabits-android/src/androidTest/assets/views-v19/habits/list/HabitCardView/render_selected.png similarity index 100% rename from app/src/androidTest/assets/views-v19/habits/list/HabitCardView/render_selected.png rename to uhabits-android/src/androidTest/assets/views-v19/habits/list/HabitCardView/render_selected.png diff --git a/app/src/androidTest/assets/views-v19/habits/list/HeaderView/render.png b/uhabits-android/src/androidTest/assets/views-v19/habits/list/HeaderView/render.png similarity index 100% rename from app/src/androidTest/assets/views-v19/habits/list/HeaderView/render.png rename to uhabits-android/src/androidTest/assets/views-v19/habits/list/HeaderView/render.png diff --git a/app/src/androidTest/assets/views-v19/habits/list/HeaderView/render_reverse.png b/uhabits-android/src/androidTest/assets/views-v19/habits/list/HeaderView/render_reverse.png similarity index 100% rename from app/src/androidTest/assets/views-v19/habits/list/HeaderView/render_reverse.png rename to uhabits-android/src/androidTest/assets/views-v19/habits/list/HeaderView/render_reverse.png diff --git a/app/src/androidTest/assets/views-v19/habits/list/HintView/render.png b/uhabits-android/src/androidTest/assets/views-v19/habits/list/HintView/render.png similarity index 100% rename from app/src/androidTest/assets/views-v19/habits/list/HintView/render.png rename to uhabits-android/src/androidTest/assets/views-v19/habits/list/HintView/render.png diff --git a/app/src/androidTest/assets/views-v19/habits/list/NumberButtonView/render_above.png b/uhabits-android/src/androidTest/assets/views-v19/habits/list/NumberButtonView/render_above.png similarity index 100% rename from app/src/androidTest/assets/views-v19/habits/list/NumberButtonView/render_above.png rename to uhabits-android/src/androidTest/assets/views-v19/habits/list/NumberButtonView/render_above.png diff --git a/app/src/androidTest/assets/views-v19/habits/list/NumberButtonView/render_below.png b/uhabits-android/src/androidTest/assets/views-v19/habits/list/NumberButtonView/render_below.png similarity index 100% rename from app/src/androidTest/assets/views-v19/habits/list/NumberButtonView/render_below.png rename to uhabits-android/src/androidTest/assets/views-v19/habits/list/NumberButtonView/render_below.png diff --git a/app/src/androidTest/assets/views-v19/habits/list/NumberButtonView/render_zero.png b/uhabits-android/src/androidTest/assets/views-v19/habits/list/NumberButtonView/render_zero.png similarity index 100% rename from app/src/androidTest/assets/views-v19/habits/list/NumberButtonView/render_zero.png rename to uhabits-android/src/androidTest/assets/views-v19/habits/list/NumberButtonView/render_zero.png diff --git a/app/src/androidTest/assets/views-v19/habits/show/FrequencyCard/render.png b/uhabits-android/src/androidTest/assets/views-v19/habits/show/FrequencyCard/render.png similarity index 100% rename from app/src/androidTest/assets/views-v19/habits/show/FrequencyCard/render.png rename to uhabits-android/src/androidTest/assets/views-v19/habits/show/FrequencyCard/render.png diff --git a/app/src/androidTest/assets/views-v19/habits/show/HistoryCard/render.png b/uhabits-android/src/androidTest/assets/views-v19/habits/show/HistoryCard/render.png similarity index 100% rename from app/src/androidTest/assets/views-v19/habits/show/HistoryCard/render.png rename to uhabits-android/src/androidTest/assets/views-v19/habits/show/HistoryCard/render.png diff --git a/app/src/androidTest/assets/views-v19/habits/show/OverviewCard/render.png b/uhabits-android/src/androidTest/assets/views-v19/habits/show/OverviewCard/render.png similarity index 100% rename from app/src/androidTest/assets/views-v19/habits/show/OverviewCard/render.png rename to uhabits-android/src/androidTest/assets/views-v19/habits/show/OverviewCard/render.png diff --git a/app/src/androidTest/assets/views-v19/habits/show/ScoreCard/render.png b/uhabits-android/src/androidTest/assets/views-v19/habits/show/ScoreCard/render.png similarity index 100% rename from app/src/androidTest/assets/views-v19/habits/show/ScoreCard/render.png rename to uhabits-android/src/androidTest/assets/views-v19/habits/show/ScoreCard/render.png diff --git a/app/src/androidTest/assets/views-v19/habits/show/StreakCard/render.png b/uhabits-android/src/androidTest/assets/views-v19/habits/show/StreakCard/render.png similarity index 100% rename from app/src/androidTest/assets/views-v19/habits/show/StreakCard/render.png rename to uhabits-android/src/androidTest/assets/views-v19/habits/show/StreakCard/render.png diff --git a/app/src/androidTest/assets/views-v19/habits/show/SubtitleCard/render.png b/uhabits-android/src/androidTest/assets/views-v19/habits/show/SubtitleCard/render.png similarity index 100% rename from app/src/androidTest/assets/views-v19/habits/show/SubtitleCard/render.png rename to uhabits-android/src/androidTest/assets/views-v19/habits/show/SubtitleCard/render.png diff --git a/app/src/androidTest/assets/views-v19/widgets/CheckmarkWidget/render.png b/uhabits-android/src/androidTest/assets/views-v19/widgets/CheckmarkWidget/render.png similarity index 100% rename from app/src/androidTest/assets/views-v19/widgets/CheckmarkWidget/render.png rename to uhabits-android/src/androidTest/assets/views-v19/widgets/CheckmarkWidget/render.png diff --git a/app/src/androidTest/assets/views-v19/widgets/CheckmarkWidgetView/checked.png b/uhabits-android/src/androidTest/assets/views-v19/widgets/CheckmarkWidgetView/checked.png similarity index 100% rename from app/src/androidTest/assets/views-v19/widgets/CheckmarkWidgetView/checked.png rename to uhabits-android/src/androidTest/assets/views-v19/widgets/CheckmarkWidgetView/checked.png diff --git a/app/src/androidTest/assets/views-v19/widgets/CheckmarkWidgetView/implicitly_checked.png b/uhabits-android/src/androidTest/assets/views-v19/widgets/CheckmarkWidgetView/implicitly_checked.png similarity index 100% rename from app/src/androidTest/assets/views-v19/widgets/CheckmarkWidgetView/implicitly_checked.png rename to uhabits-android/src/androidTest/assets/views-v19/widgets/CheckmarkWidgetView/implicitly_checked.png diff --git a/app/src/androidTest/assets/views-v19/widgets/CheckmarkWidgetView/large_size.png b/uhabits-android/src/androidTest/assets/views-v19/widgets/CheckmarkWidgetView/large_size.png similarity index 100% rename from app/src/androidTest/assets/views-v19/widgets/CheckmarkWidgetView/large_size.png rename to uhabits-android/src/androidTest/assets/views-v19/widgets/CheckmarkWidgetView/large_size.png diff --git a/app/src/androidTest/assets/views-v19/widgets/CheckmarkWidgetView/unchecked.png b/uhabits-android/src/androidTest/assets/views-v19/widgets/CheckmarkWidgetView/unchecked.png similarity index 100% rename from app/src/androidTest/assets/views-v19/widgets/CheckmarkWidgetView/unchecked.png rename to uhabits-android/src/androidTest/assets/views-v19/widgets/CheckmarkWidgetView/unchecked.png diff --git a/app/src/androidTest/assets/views-v19/widgets/FrequencyWidget/render.png b/uhabits-android/src/androidTest/assets/views-v19/widgets/FrequencyWidget/render.png similarity index 100% rename from app/src/androidTest/assets/views-v19/widgets/FrequencyWidget/render.png rename to uhabits-android/src/androidTest/assets/views-v19/widgets/FrequencyWidget/render.png diff --git a/app/src/androidTest/assets/views-v19/widgets/HistoryWidget/render.png b/uhabits-android/src/androidTest/assets/views-v19/widgets/HistoryWidget/render.png similarity index 100% rename from app/src/androidTest/assets/views-v19/widgets/HistoryWidget/render.png rename to uhabits-android/src/androidTest/assets/views-v19/widgets/HistoryWidget/render.png diff --git a/app/src/androidTest/assets/views-v19/widgets/ScoreWidget/render.png b/uhabits-android/src/androidTest/assets/views-v19/widgets/ScoreWidget/render.png similarity index 100% rename from app/src/androidTest/assets/views-v19/widgets/ScoreWidget/render.png rename to uhabits-android/src/androidTest/assets/views-v19/widgets/ScoreWidget/render.png diff --git a/app/src/androidTest/assets/views-v19/widgets/StreakWidget/render.png b/uhabits-android/src/androidTest/assets/views-v19/widgets/StreakWidget/render.png similarity index 100% rename from app/src/androidTest/assets/views-v19/widgets/StreakWidget/render.png rename to uhabits-android/src/androidTest/assets/views-v19/widgets/StreakWidget/render.png diff --git a/app/src/androidTest/assets/views-v21/common/BarChart/render.png b/uhabits-android/src/androidTest/assets/views-v21/common/BarChart/render.png similarity index 100% rename from app/src/androidTest/assets/views-v21/common/BarChart/render.png rename to uhabits-android/src/androidTest/assets/views-v21/common/BarChart/render.png diff --git a/app/src/androidTest/assets/views-v21/common/BarChart/renderDataOffset.png b/uhabits-android/src/androidTest/assets/views-v21/common/BarChart/renderDataOffset.png similarity index 100% rename from app/src/androidTest/assets/views-v21/common/BarChart/renderDataOffset.png rename to uhabits-android/src/androidTest/assets/views-v21/common/BarChart/renderDataOffset.png diff --git a/app/src/androidTest/assets/views-v21/common/BarChart/renderDifferentSize.png b/uhabits-android/src/androidTest/assets/views-v21/common/BarChart/renderDifferentSize.png similarity index 100% rename from app/src/androidTest/assets/views-v21/common/BarChart/renderDifferentSize.png rename to uhabits-android/src/androidTest/assets/views-v21/common/BarChart/renderDifferentSize.png diff --git a/app/src/androidTest/assets/views-v21/common/BarChart/renderTransparent.png b/uhabits-android/src/androidTest/assets/views-v21/common/BarChart/renderTransparent.png similarity index 100% rename from app/src/androidTest/assets/views-v21/common/BarChart/renderTransparent.png rename to uhabits-android/src/androidTest/assets/views-v21/common/BarChart/renderTransparent.png diff --git a/app/src/androidTest/assets/views-v21/common/FrequencyChart/render.png b/uhabits-android/src/androidTest/assets/views-v21/common/FrequencyChart/render.png similarity index 100% rename from app/src/androidTest/assets/views-v21/common/FrequencyChart/render.png rename to uhabits-android/src/androidTest/assets/views-v21/common/FrequencyChart/render.png diff --git a/app/src/androidTest/assets/views-v21/common/FrequencyChart/renderDataOffset.png b/uhabits-android/src/androidTest/assets/views-v21/common/FrequencyChart/renderDataOffset.png similarity index 100% rename from app/src/androidTest/assets/views-v21/common/FrequencyChart/renderDataOffset.png rename to uhabits-android/src/androidTest/assets/views-v21/common/FrequencyChart/renderDataOffset.png diff --git a/app/src/androidTest/assets/views-v21/common/FrequencyChart/renderDifferentSize.png b/uhabits-android/src/androidTest/assets/views-v21/common/FrequencyChart/renderDifferentSize.png similarity index 100% rename from app/src/androidTest/assets/views-v21/common/FrequencyChart/renderDifferentSize.png rename to uhabits-android/src/androidTest/assets/views-v21/common/FrequencyChart/renderDifferentSize.png diff --git a/app/src/androidTest/assets/views-v21/common/FrequencyChart/renderTransparent.png b/uhabits-android/src/androidTest/assets/views-v21/common/FrequencyChart/renderTransparent.png similarity index 100% rename from app/src/androidTest/assets/views-v21/common/FrequencyChart/renderTransparent.png rename to uhabits-android/src/androidTest/assets/views-v21/common/FrequencyChart/renderTransparent.png diff --git a/app/src/androidTest/assets/views-v21/common/HistoryChart/render.png b/uhabits-android/src/androidTest/assets/views-v21/common/HistoryChart/render.png similarity index 100% rename from app/src/androidTest/assets/views-v21/common/HistoryChart/render.png rename to uhabits-android/src/androidTest/assets/views-v21/common/HistoryChart/render.png diff --git a/app/src/androidTest/assets/views-v21/common/HistoryChart/renderDataOffset.png b/uhabits-android/src/androidTest/assets/views-v21/common/HistoryChart/renderDataOffset.png similarity index 100% rename from app/src/androidTest/assets/views-v21/common/HistoryChart/renderDataOffset.png rename to uhabits-android/src/androidTest/assets/views-v21/common/HistoryChart/renderDataOffset.png diff --git a/app/src/androidTest/assets/views-v21/common/HistoryChart/renderDifferentSize.png b/uhabits-android/src/androidTest/assets/views-v21/common/HistoryChart/renderDifferentSize.png similarity index 100% rename from app/src/androidTest/assets/views-v21/common/HistoryChart/renderDifferentSize.png rename to uhabits-android/src/androidTest/assets/views-v21/common/HistoryChart/renderDifferentSize.png diff --git a/app/src/androidTest/assets/views-v21/common/HistoryChart/renderTransparent.png b/uhabits-android/src/androidTest/assets/views-v21/common/HistoryChart/renderTransparent.png similarity index 100% rename from app/src/androidTest/assets/views-v21/common/HistoryChart/renderTransparent.png rename to uhabits-android/src/androidTest/assets/views-v21/common/HistoryChart/renderTransparent.png diff --git a/app/src/androidTest/assets/views-v21/common/RingView/render.png b/uhabits-android/src/androidTest/assets/views-v21/common/RingView/render.png similarity index 100% rename from app/src/androidTest/assets/views-v21/common/RingView/render.png rename to uhabits-android/src/androidTest/assets/views-v21/common/RingView/render.png diff --git a/app/src/androidTest/assets/views-v21/common/RingView/renderDifferentParams.png b/uhabits-android/src/androidTest/assets/views-v21/common/RingView/renderDifferentParams.png similarity index 100% rename from app/src/androidTest/assets/views-v21/common/RingView/renderDifferentParams.png rename to uhabits-android/src/androidTest/assets/views-v21/common/RingView/renderDifferentParams.png diff --git a/app/src/androidTest/assets/views-v21/common/ScoreChart/render.png b/uhabits-android/src/androidTest/assets/views-v21/common/ScoreChart/render.png similarity index 100% rename from app/src/androidTest/assets/views-v21/common/ScoreChart/render.png rename to uhabits-android/src/androidTest/assets/views-v21/common/ScoreChart/render.png diff --git a/app/src/androidTest/assets/views-v21/common/ScoreChart/renderDataOffset.png b/uhabits-android/src/androidTest/assets/views-v21/common/ScoreChart/renderDataOffset.png similarity index 100% rename from app/src/androidTest/assets/views-v21/common/ScoreChart/renderDataOffset.png rename to uhabits-android/src/androidTest/assets/views-v21/common/ScoreChart/renderDataOffset.png diff --git a/app/src/androidTest/assets/views-v21/common/ScoreChart/renderDifferentSize.png b/uhabits-android/src/androidTest/assets/views-v21/common/ScoreChart/renderDifferentSize.png similarity index 100% rename from app/src/androidTest/assets/views-v21/common/ScoreChart/renderDifferentSize.png rename to uhabits-android/src/androidTest/assets/views-v21/common/ScoreChart/renderDifferentSize.png diff --git a/app/src/androidTest/assets/views-v21/common/ScoreChart/renderMonthly.png b/uhabits-android/src/androidTest/assets/views-v21/common/ScoreChart/renderMonthly.png similarity index 100% rename from app/src/androidTest/assets/views-v21/common/ScoreChart/renderMonthly.png rename to uhabits-android/src/androidTest/assets/views-v21/common/ScoreChart/renderMonthly.png diff --git a/app/src/androidTest/assets/views-v21/common/ScoreChart/renderTransparent.png b/uhabits-android/src/androidTest/assets/views-v21/common/ScoreChart/renderTransparent.png similarity index 100% rename from app/src/androidTest/assets/views-v21/common/ScoreChart/renderTransparent.png rename to uhabits-android/src/androidTest/assets/views-v21/common/ScoreChart/renderTransparent.png diff --git a/app/src/androidTest/assets/views-v21/common/ScoreChart/renderYearly.png b/uhabits-android/src/androidTest/assets/views-v21/common/ScoreChart/renderYearly.png similarity index 100% rename from app/src/androidTest/assets/views-v21/common/ScoreChart/renderYearly.png rename to uhabits-android/src/androidTest/assets/views-v21/common/ScoreChart/renderYearly.png diff --git a/app/src/androidTest/assets/views-v21/common/StreakChart/render.png b/uhabits-android/src/androidTest/assets/views-v21/common/StreakChart/render.png similarity index 100% rename from app/src/androidTest/assets/views-v21/common/StreakChart/render.png rename to uhabits-android/src/androidTest/assets/views-v21/common/StreakChart/render.png diff --git a/app/src/androidTest/assets/views-v21/common/StreakChart/renderSmallSize.png b/uhabits-android/src/androidTest/assets/views-v21/common/StreakChart/renderSmallSize.png similarity index 100% rename from app/src/androidTest/assets/views-v21/common/StreakChart/renderSmallSize.png rename to uhabits-android/src/androidTest/assets/views-v21/common/StreakChart/renderSmallSize.png diff --git a/app/src/androidTest/assets/views-v21/common/StreakChart/renderTransparent.png b/uhabits-android/src/androidTest/assets/views-v21/common/StreakChart/renderTransparent.png similarity index 100% rename from app/src/androidTest/assets/views-v21/common/StreakChart/renderTransparent.png rename to uhabits-android/src/androidTest/assets/views-v21/common/StreakChart/renderTransparent.png diff --git a/app/src/androidTest/assets/views-v21/habits/list/CheckmarkButtonView/render_explicit_check.png b/uhabits-android/src/androidTest/assets/views-v21/habits/list/CheckmarkButtonView/render_explicit_check.png similarity index 100% rename from app/src/androidTest/assets/views-v21/habits/list/CheckmarkButtonView/render_explicit_check.png rename to uhabits-android/src/androidTest/assets/views-v21/habits/list/CheckmarkButtonView/render_explicit_check.png diff --git a/app/src/androidTest/assets/views-v21/habits/list/CheckmarkButtonView/render_implicit_check.png b/uhabits-android/src/androidTest/assets/views-v21/habits/list/CheckmarkButtonView/render_implicit_check.png similarity index 100% rename from app/src/androidTest/assets/views-v21/habits/list/CheckmarkButtonView/render_implicit_check.png rename to uhabits-android/src/androidTest/assets/views-v21/habits/list/CheckmarkButtonView/render_implicit_check.png diff --git a/app/src/androidTest/assets/views-v21/habits/list/CheckmarkButtonView/render_unchecked.png b/uhabits-android/src/androidTest/assets/views-v21/habits/list/CheckmarkButtonView/render_unchecked.png similarity index 100% rename from app/src/androidTest/assets/views-v21/habits/list/CheckmarkButtonView/render_unchecked.png rename to uhabits-android/src/androidTest/assets/views-v21/habits/list/CheckmarkButtonView/render_unchecked.png diff --git a/app/src/androidTest/assets/views-v21/habits/list/CheckmarkPanelView/render.png b/uhabits-android/src/androidTest/assets/views-v21/habits/list/CheckmarkPanelView/render.png similarity index 100% rename from app/src/androidTest/assets/views-v21/habits/list/CheckmarkPanelView/render.png rename to uhabits-android/src/androidTest/assets/views-v21/habits/list/CheckmarkPanelView/render.png diff --git a/app/src/androidTest/assets/views-v21/habits/list/HabitCardView/render.png b/uhabits-android/src/androidTest/assets/views-v21/habits/list/HabitCardView/render.png similarity index 100% rename from app/src/androidTest/assets/views-v21/habits/list/HabitCardView/render.png rename to uhabits-android/src/androidTest/assets/views-v21/habits/list/HabitCardView/render.png diff --git a/app/src/androidTest/assets/views-v21/habits/list/HabitCardView/render_changed.png b/uhabits-android/src/androidTest/assets/views-v21/habits/list/HabitCardView/render_changed.png similarity index 100% rename from app/src/androidTest/assets/views-v21/habits/list/HabitCardView/render_changed.png rename to uhabits-android/src/androidTest/assets/views-v21/habits/list/HabitCardView/render_changed.png diff --git a/app/src/androidTest/assets/views-v21/habits/list/HabitCardView/render_selected.png b/uhabits-android/src/androidTest/assets/views-v21/habits/list/HabitCardView/render_selected.png similarity index 100% rename from app/src/androidTest/assets/views-v21/habits/list/HabitCardView/render_selected.png rename to uhabits-android/src/androidTest/assets/views-v21/habits/list/HabitCardView/render_selected.png diff --git a/app/src/androidTest/assets/views-v21/habits/list/HeaderView/render.png b/uhabits-android/src/androidTest/assets/views-v21/habits/list/HeaderView/render.png similarity index 100% rename from app/src/androidTest/assets/views-v21/habits/list/HeaderView/render.png rename to uhabits-android/src/androidTest/assets/views-v21/habits/list/HeaderView/render.png diff --git a/app/src/androidTest/assets/views-v21/habits/list/HeaderView/render_reverse.png b/uhabits-android/src/androidTest/assets/views-v21/habits/list/HeaderView/render_reverse.png similarity index 100% rename from app/src/androidTest/assets/views-v21/habits/list/HeaderView/render_reverse.png rename to uhabits-android/src/androidTest/assets/views-v21/habits/list/HeaderView/render_reverse.png diff --git a/app/src/androidTest/assets/views-v21/habits/list/HintView/render.png b/uhabits-android/src/androidTest/assets/views-v21/habits/list/HintView/render.png similarity index 100% rename from app/src/androidTest/assets/views-v21/habits/list/HintView/render.png rename to uhabits-android/src/androidTest/assets/views-v21/habits/list/HintView/render.png diff --git a/app/src/androidTest/assets/views-v21/habits/list/NumberButtonView/render_above.png b/uhabits-android/src/androidTest/assets/views-v21/habits/list/NumberButtonView/render_above.png similarity index 100% rename from app/src/androidTest/assets/views-v21/habits/list/NumberButtonView/render_above.png rename to uhabits-android/src/androidTest/assets/views-v21/habits/list/NumberButtonView/render_above.png diff --git a/app/src/androidTest/assets/views-v21/habits/list/NumberButtonView/render_below.png b/uhabits-android/src/androidTest/assets/views-v21/habits/list/NumberButtonView/render_below.png similarity index 100% rename from app/src/androidTest/assets/views-v21/habits/list/NumberButtonView/render_below.png rename to uhabits-android/src/androidTest/assets/views-v21/habits/list/NumberButtonView/render_below.png diff --git a/app/src/androidTest/assets/views-v21/habits/list/NumberButtonView/render_zero.png b/uhabits-android/src/androidTest/assets/views-v21/habits/list/NumberButtonView/render_zero.png similarity index 100% rename from app/src/androidTest/assets/views-v21/habits/list/NumberButtonView/render_zero.png rename to uhabits-android/src/androidTest/assets/views-v21/habits/list/NumberButtonView/render_zero.png diff --git a/app/src/androidTest/assets/views-v21/habits/show/FrequencyCard/render.png b/uhabits-android/src/androidTest/assets/views-v21/habits/show/FrequencyCard/render.png similarity index 100% rename from app/src/androidTest/assets/views-v21/habits/show/FrequencyCard/render.png rename to uhabits-android/src/androidTest/assets/views-v21/habits/show/FrequencyCard/render.png diff --git a/app/src/androidTest/assets/views-v21/habits/show/HistoryCard/render.png b/uhabits-android/src/androidTest/assets/views-v21/habits/show/HistoryCard/render.png similarity index 100% rename from app/src/androidTest/assets/views-v21/habits/show/HistoryCard/render.png rename to uhabits-android/src/androidTest/assets/views-v21/habits/show/HistoryCard/render.png diff --git a/app/src/androidTest/assets/views-v21/habits/show/OverviewCard/render.png b/uhabits-android/src/androidTest/assets/views-v21/habits/show/OverviewCard/render.png similarity index 100% rename from app/src/androidTest/assets/views-v21/habits/show/OverviewCard/render.png rename to uhabits-android/src/androidTest/assets/views-v21/habits/show/OverviewCard/render.png diff --git a/app/src/androidTest/assets/views-v21/habits/show/ScoreCard/render.png b/uhabits-android/src/androidTest/assets/views-v21/habits/show/ScoreCard/render.png similarity index 100% rename from app/src/androidTest/assets/views-v21/habits/show/ScoreCard/render.png rename to uhabits-android/src/androidTest/assets/views-v21/habits/show/ScoreCard/render.png diff --git a/app/src/androidTest/assets/views-v21/habits/show/StreakCard/render.png b/uhabits-android/src/androidTest/assets/views-v21/habits/show/StreakCard/render.png similarity index 100% rename from app/src/androidTest/assets/views-v21/habits/show/StreakCard/render.png rename to uhabits-android/src/androidTest/assets/views-v21/habits/show/StreakCard/render.png diff --git a/app/src/androidTest/assets/views-v21/habits/show/SubtitleCard/render.png b/uhabits-android/src/androidTest/assets/views-v21/habits/show/SubtitleCard/render.png similarity index 100% rename from app/src/androidTest/assets/views-v21/habits/show/SubtitleCard/render.png rename to uhabits-android/src/androidTest/assets/views-v21/habits/show/SubtitleCard/render.png diff --git a/app/src/androidTest/assets/views-v21/widgets/CheckmarkWidget/render.png b/uhabits-android/src/androidTest/assets/views-v21/widgets/CheckmarkWidget/render.png similarity index 100% rename from app/src/androidTest/assets/views-v21/widgets/CheckmarkWidget/render.png rename to uhabits-android/src/androidTest/assets/views-v21/widgets/CheckmarkWidget/render.png diff --git a/app/src/androidTest/assets/views-v21/widgets/CheckmarkWidgetView/checked.png b/uhabits-android/src/androidTest/assets/views-v21/widgets/CheckmarkWidgetView/checked.png similarity index 100% rename from app/src/androidTest/assets/views-v21/widgets/CheckmarkWidgetView/checked.png rename to uhabits-android/src/androidTest/assets/views-v21/widgets/CheckmarkWidgetView/checked.png diff --git a/app/src/androidTest/assets/views-v21/widgets/CheckmarkWidgetView/implicitly_checked.png b/uhabits-android/src/androidTest/assets/views-v21/widgets/CheckmarkWidgetView/implicitly_checked.png similarity index 100% rename from app/src/androidTest/assets/views-v21/widgets/CheckmarkWidgetView/implicitly_checked.png rename to uhabits-android/src/androidTest/assets/views-v21/widgets/CheckmarkWidgetView/implicitly_checked.png diff --git a/app/src/androidTest/assets/views-v21/widgets/CheckmarkWidgetView/large_size.png b/uhabits-android/src/androidTest/assets/views-v21/widgets/CheckmarkWidgetView/large_size.png similarity index 100% rename from app/src/androidTest/assets/views-v21/widgets/CheckmarkWidgetView/large_size.png rename to uhabits-android/src/androidTest/assets/views-v21/widgets/CheckmarkWidgetView/large_size.png diff --git a/app/src/androidTest/assets/views-v21/widgets/CheckmarkWidgetView/unchecked.png b/uhabits-android/src/androidTest/assets/views-v21/widgets/CheckmarkWidgetView/unchecked.png similarity index 100% rename from app/src/androidTest/assets/views-v21/widgets/CheckmarkWidgetView/unchecked.png rename to uhabits-android/src/androidTest/assets/views-v21/widgets/CheckmarkWidgetView/unchecked.png diff --git a/app/src/androidTest/assets/views-v21/widgets/FrequencyWidget/render.png b/uhabits-android/src/androidTest/assets/views-v21/widgets/FrequencyWidget/render.png similarity index 100% rename from app/src/androidTest/assets/views-v21/widgets/FrequencyWidget/render.png rename to uhabits-android/src/androidTest/assets/views-v21/widgets/FrequencyWidget/render.png diff --git a/app/src/androidTest/assets/views-v21/widgets/HistoryWidget/render.png b/uhabits-android/src/androidTest/assets/views-v21/widgets/HistoryWidget/render.png similarity index 100% rename from app/src/androidTest/assets/views-v21/widgets/HistoryWidget/render.png rename to uhabits-android/src/androidTest/assets/views-v21/widgets/HistoryWidget/render.png diff --git a/app/src/androidTest/assets/views-v21/widgets/ScoreWidget/render.png b/uhabits-android/src/androidTest/assets/views-v21/widgets/ScoreWidget/render.png similarity index 100% rename from app/src/androidTest/assets/views-v21/widgets/ScoreWidget/render.png rename to uhabits-android/src/androidTest/assets/views-v21/widgets/ScoreWidget/render.png diff --git a/app/src/androidTest/assets/views-v21/widgets/StreakWidget/render.png b/uhabits-android/src/androidTest/assets/views-v21/widgets/StreakWidget/render.png similarity index 100% rename from app/src/androidTest/assets/views-v21/widgets/StreakWidget/render.png rename to uhabits-android/src/androidTest/assets/views-v21/widgets/StreakWidget/render.png diff --git a/app/src/androidTest/java/org/isoron/uhabits/AndroidTestComponent.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/AndroidTestComponent.java similarity index 67% rename from app/src/androidTest/java/org/isoron/uhabits/AndroidTestComponent.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/AndroidTestComponent.java index 55a756d92..a25bd202b 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/AndroidTestComponent.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/AndroidTestComponent.java @@ -20,17 +20,32 @@ package org.isoron.uhabits; +import org.isoron.androidbase.*; +import org.isoron.uhabits.core.*; +import org.isoron.uhabits.core.tasks.*; import org.isoron.uhabits.models.sqlite.*; -import org.isoron.uhabits.tasks.*; import dagger.*; @AppScope @Component(modules = { - AppModule.class, SingleThreadTaskRunner.class, SQLModelFactory.class + AppModule.class, + HabitsModule.class, + SingleThreadModule.class, + SQLModelFactory.class }) -public interface AndroidTestComponent extends AppComponent +public interface AndroidTestComponent extends HabitsComponent { +} +@Module +class SingleThreadModule +{ + @Provides + @AppScope + public static TaskRunner provideTaskRunner() + { + return new SingleThreadTaskRunner(); + } } diff --git a/app/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.java similarity index 85% rename from app/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.java index ca2004688..b731888f5 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseAndroidTest.java @@ -25,11 +25,16 @@ import android.content.res.*; import android.os.*; import android.support.annotation.*; import android.support.test.*; +import android.support.test.filters.*; import android.util.*; -import org.isoron.uhabits.models.*; +import junit.framework.*; + +import org.isoron.androidbase.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.tasks.*; +import org.isoron.uhabits.core.utils.*; import org.isoron.uhabits.preferences.*; -import org.isoron.uhabits.tasks.*; import org.isoron.uhabits.utils.*; import org.junit.*; @@ -37,22 +42,20 @@ import java.io.*; import java.util.*; import java.util.concurrent.*; -import static junit.framework.Assert.*; -import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.CoreMatchers.*; +import static org.hamcrest.MatcherAssert.*; -public class BaseAndroidTest +@MediumTest +public class BaseAndroidTest extends TestCase { // 8:00am, January 25th, 2015 (UTC) public static final long FIXED_LOCAL_TIME = 1422172800000L; - private static boolean isLooperPrepared; - protected Context testContext; protected Context targetContext; - protected Preferences prefs; + protected AndroidPreferences prefs; protected HabitList habitList; @@ -68,14 +71,13 @@ public class BaseAndroidTest protected ModelFactory modelFactory; + protected BaseSystem baseSystem; + + @Override @Before public void setUp() { - if (!isLooperPrepared) - { - Looper.prepare(); - isLooperPrepared = true; - } + if (Looper.myLooper() == null) Looper.prepare(); targetContext = InstrumentationRegistry.getTargetContext(); testContext = InstrumentationRegistry.getContext(); @@ -90,6 +92,8 @@ public class BaseAndroidTest .appModule(new AppModule(targetContext.getApplicationContext())) .build(); + baseSystem = new BaseSystem(targetContext); + HabitsApplication.setComponent(component); prefs = component.getPreferences(); habitList = component.getHabitList(); @@ -155,9 +159,16 @@ public class BaseAndroidTest } } + public long timestamp(int year, int month, int day) + { + GregorianCalendar cal = DateUtils.getStartOfTodayCalendar(); + cal.set(year, month, day); + return cal.getTimeInMillis(); + } + protected void startTracing() { - File dir = FileUtils.getFilesDir(targetContext, "Profile"); + File dir = baseSystem.getFilesDir("Profile"); assertNotNull(dir); String tracePath = dir.getAbsolutePath() + "/performance.trace"; Log.d("PerformanceTest", String.format("Saving trace file to %s", tracePath)); diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseUIAutomatorTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseUIAutomatorTest.java new file mode 100644 index 000000000..1d674e21d --- /dev/null +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseUIAutomatorTest.java @@ -0,0 +1,85 @@ +/* + * 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; + +import android.content.*; +import android.support.test.filters.*; +import android.support.test.uiautomator.*; + +import com.linkedin.android.testbutler.*; + +import org.isoron.androidbase.*; +import org.isoron.androidbase.utils.*; +import org.isoron.uhabits.preferences.*; +import org.isoron.uhabits.utils.*; +import org.junit.*; + +import java.io.*; + +import static android.support.test.InstrumentationRegistry.*; +import static android.support.test.uiautomator.UiDevice.*; + +@LargeTest +public class BaseUIAutomatorTest +{ + private static final String PKG = "org.isoron.uhabits"; + + public static UiDevice device; + + private HabitsComponent component; + + @Before + public void setUp() throws IOException + { + TestButler.setup(getTargetContext()); + TestButler.verifyAnimationsDisabled(getTargetContext()); + device = getInstance(getInstrumentation()); + + component = DaggerHabitsComponent + .builder() + .appModule(new AppModule(getTargetContext())) + .build(); + + AndroidPreferences prefs = component.getPreferences(); + prefs.reset(); + prefs.setFirstRun(false); + + HabitsApplication.setComponent(component); + + FileUtils.copy(getContext().getAssets().open("test.db"), + DatabaseUtils.getDatabaseFile(getTargetContext())); + } + + @After + public void tearDown() throws Exception + { + device.pressHome(); + device.waitForIdle(); + TestButler.teardown(getTargetContext()); + } + + public static void startActivity(Class cls) + { + Intent intent = new Intent(); + intent.setComponent(new ComponentName(PKG, cls.getCanonicalName())); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); + getContext().startActivity(intent); + } +} diff --git a/app/src/androidTest/java/org/isoron/uhabits/BaseViewTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseViewTest.java similarity index 98% rename from app/src/androidTest/java/org/isoron/uhabits/BaseViewTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseViewTest.java index c6d73d59f..b63e3ed65 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/BaseViewTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/BaseViewTest.java @@ -24,6 +24,7 @@ import android.support.annotation.*; import android.view.*; import android.widget.*; +import org.isoron.androidbase.utils.*; import org.isoron.uhabits.utils.*; import org.isoron.uhabits.widgets.*; @@ -34,7 +35,6 @@ import static android.os.Build.VERSION.*; import static android.os.Build.VERSION_CODES.KITKAT; import static android.os.Build.VERSION_CODES.LOLLIPOP; import static android.view.View.MeasureSpec.*; -import static junit.framework.Assert.*; public class BaseViewTest extends BaseAndroidTest { @@ -170,7 +170,7 @@ public class BaseViewTest extends BaseAndroidTest { File dir = FileUtils.getSDCardDir("test-screenshots"); if (dir == null) - dir = FileUtils.getFilesDir(targetContext, "test-screenshots"); + dir = baseSystem.getFilesDir("test-screenshots"); if (dir == null) throw new RuntimeException( "Could not find suitable dir for screenshots"); diff --git a/app/src/androidTest/java/org/isoron/uhabits/HabitFixtures.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitFixtures.java similarity index 94% rename from app/src/androidTest/java/org/isoron/uhabits/HabitFixtures.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitFixtures.java index 288e45c3f..3c475a0a0 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/HabitFixtures.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitFixtures.java @@ -19,8 +19,8 @@ package org.isoron.uhabits; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.utils.DateUtils; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.utils.DateUtils; public class HabitFixtures { @@ -73,7 +73,7 @@ public class HabitFixtures 81, 83, 89, 90, 91, 95, 102, 103, 108, 109, 120}; for (int mark : marks) - habit.getRepetitions().toggleTimestamp(today - mark * day); + habit.getRepetitions().toggle(today - mark * day); return habit; } @@ -108,7 +108,7 @@ public class HabitFixtures long timestamp = DateUtils.getStartOfToday(); for (boolean c : LONG_HABIT_CHECKS) { - if (c) habit.getRepetitions().toggleTimestamp(timestamp); + if (c) habit.getRepetitions().toggle(timestamp); timestamp -= DateUtils.millisecondsInOneDay; } diff --git a/app/src/androidTest/java/org/isoron/uhabits/HabitLoggerTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitLoggerTest.java similarity index 96% rename from app/src/androidTest/java/org/isoron/uhabits/HabitLoggerTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitLoggerTest.java index bf252ef61..78ae34631 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/HabitLoggerTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitLoggerTest.java @@ -23,8 +23,8 @@ import android.os.*; import android.support.test.runner.*; import android.test.suitebuilder.annotation.*; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.activities.*; +import org.isoron.androidbase.*; +import org.isoron.uhabits.core.models.*; import org.junit.*; import org.junit.runner.*; diff --git a/app/src/androidTest/java/org/isoron/uhabits/HabitsApplicationTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitsApplicationTest.java similarity index 97% rename from app/src/androidTest/java/org/isoron/uhabits/HabitsApplicationTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitsApplicationTest.java index d97f03ea3..fae3ff95e 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/HabitsApplicationTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/HabitsApplicationTest.java @@ -22,7 +22,7 @@ package org.isoron.uhabits; import android.support.test.runner.*; import android.test.suitebuilder.annotation.*; -import org.isoron.uhabits.activities.*; +import org.isoron.androidbase.*; import org.junit.*; import org.junit.runner.*; diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/AboutTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/AboutTest.java new file mode 100644 index 000000000..35d5722ab --- /dev/null +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/AboutTest.java @@ -0,0 +1,46 @@ +/* + * 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.acceptance; + +import org.isoron.uhabits.*; +import org.junit.*; + +import static org.isoron.uhabits.acceptance.steps.CommonSteps.*; +import static org.isoron.uhabits.acceptance.steps.ListHabitsSteps.MenuItem.*; +import static org.isoron.uhabits.acceptance.steps.ListHabitsSteps.*; + +public class AboutTest extends BaseUIAutomatorTest +{ + @Test + public void shouldDisplayAboutScreen() + { + launchApp(); + clickMenu(ABOUT); + verifyDisplaysText("Loop Habit Tracker"); + verifyDisplaysText("Rate this app on Google Play"); + verifyDisplaysText("Developers"); + verifyDisplaysText("Translators"); + + launchApp(); + clickMenu(SETTINGS); + clickText("About"); + verifyDisplaysText("Translators"); + } +} diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/HabitsTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/HabitsTest.java new file mode 100644 index 000000000..bad651adf --- /dev/null +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/HabitsTest.java @@ -0,0 +1,107 @@ +/* + * 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.acceptance; + +import org.isoron.uhabits.*; +import org.junit.*; + +import static org.isoron.uhabits.acceptance.steps.CommonSteps.*; +import static org.isoron.uhabits.acceptance.steps.EditHabitSteps.*; +import static org.isoron.uhabits.acceptance.steps.ListHabitsSteps.MenuItem.*; +import static org.isoron.uhabits.acceptance.steps.ListHabitsSteps.*; + +public class HabitsTest extends BaseUIAutomatorTest +{ + @Test + public void shouldCreateHabit() throws Exception + { + launchApp(); + clickMenu(CREATE_HABIT); + typeName("Hello world"); + typeQuestion("Did you say hello to the world today?"); + pickFrequency("Every week"); + pickColor(5); + clickSave(); + verifyDisplaysText("Hello world"); + } + + @Test + public void shouldShowHabitStatistics() throws Exception + { + launchApp(); + clickText("Track time"); + verifyDisplayGraphs(); + } + + @Test + public void shouldDeleteHabit() throws Exception + { + launchApp(); + longClickText("Track time"); + clickMenu(DELETE); + clickOK(); + verifyDoesNotDisplayText("Track time"); + } + + @Test + public void shouldEditHabit() throws Exception + { + launchApp(); + longClickText("Track time"); + clickMenu(EDIT_HABIT); + typeName("Take a walk"); + typeQuestion("Did you take a walk today?"); + clickSave(); + verifyDisplaysText("Take a walk"); + verifyDoesNotDisplayText("Track time"); + } + + @Test + public void shouldEditHabit_fromStatisticsScreen() throws Exception + { + launchApp(); + clickText("Track time"); + clickMenu(EDIT_HABIT); + typeName("Take a walk"); + typeQuestion("Did you take a walk today?"); + pickColor(10); + clickSave(); + verifyDisplaysText("Take a walk"); + pressBack(); + verifyDisplaysText("Take a walk"); + verifyDoesNotDisplayText("Track time"); + } + + @Test + public void shouldArchiveAndUnarchiveHabits() throws Exception + { + launchApp(); + longClickText("Track time"); + clickMenu(ARCHIVE); + verifyDoesNotDisplayText("Track time"); + clickMenu(HIDE_ARCHIVED); + verifyDisplaysText("Track time"); + + longClickText("Track time"); + clickMenu(UNARCHIVE); + clickMenu(HIDE_ARCHIVED); + verifyDisplaysText("Track time"); + } +} diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/LinksTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/LinksTest.java new file mode 100644 index 000000000..ad788acf4 --- /dev/null +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/LinksTest.java @@ -0,0 +1,63 @@ +/* + * 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.acceptance; + +import org.isoron.uhabits.*; +import org.junit.*; + +import static org.isoron.uhabits.acceptance.steps.CommonSteps.*; +import static org.isoron.uhabits.acceptance.steps.ListHabitsSteps.*; +import static org.isoron.uhabits.acceptance.steps.ListHabitsSteps.MenuItem.ABOUT; +import static org.isoron.uhabits.acceptance.steps.ListHabitsSteps.MenuItem.HELP; +import static org.isoron.uhabits.acceptance.steps.ListHabitsSteps.MenuItem.SETTINGS; + +public class LinksTest extends BaseUIAutomatorTest +{ + @Test + public void shouldLinkToSourceCode() throws Exception + { + launchApp(); + clickMenu(ABOUT); + clickText("View source code at GitHub"); + verifyOpensWebsite("https://github.com/iSoron/uhabits"); + } + + @Test + public void shouldLinkToTranslationWebsite() throws Exception + { + launchApp(); + clickMenu(ABOUT); + clickText("Help translate this app"); + verifyOpensWebsite("translate.loophabits.org"); + } + + @Test + public void shouldLinkToHelp() throws Exception + { + launchApp(); + clickMenu(HELP); + verifyOpensWebsite("loophabits.org/faq.html"); + + launchApp(); + clickMenu(SETTINGS); + clickText("Help & FAQ"); + verifyOpensWebsite("loophabits.org/faq.html"); + } +} diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/CommonSteps.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/CommonSteps.java new file mode 100644 index 000000000..d41d6f5c0 --- /dev/null +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/CommonSteps.java @@ -0,0 +1,127 @@ +/* + * 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.acceptance.steps; + +import android.support.annotation.*; +import android.support.test.espresso.*; +import android.support.test.espresso.contrib.*; +import android.support.test.uiautomator.*; +import android.support.v7.widget.*; + +import org.isoron.uhabits.*; +import org.isoron.uhabits.activities.habits.list.*; + +import static android.support.test.espresso.Espresso.*; +import static android.support.test.espresso.action.ViewActions.*; +import static android.support.test.espresso.assertion.ViewAssertions.*; +import static android.support.test.espresso.matcher.ViewMatchers.*; +import static junit.framework.Assert.*; +import static org.hamcrest.CoreMatchers.*; + +public class CommonSteps extends BaseUIAutomatorTest +{ + public static void clickOK() + { + clickText("OK"); + } + + public static void pressBack() + { + device.pressBack(); + } + + public static void clickText(String text) + { + scrollToText(text); + onView(withText(text)).perform(click()); + } + + public static void clickText(@StringRes int id) + { + onView(withText(id)).perform(click()); + } + + public static void launchApp() + { + startActivity(ListHabitsActivity.class); + assertTrue( + device.wait(Until.hasObject(By.pkg("org.isoron.uhabits")), 5000)); + device.waitForIdle(); + } + + public static void longClickText(String text) + { + scrollToText(text); + onView(withText(text)).perform(longClick()); + } + + public static void scrollToText(String text) + { + try + { + if (device + .findObject(new UiSelector().className(RecyclerView.class)) + .exists()) + { + onView(instanceOf(RecyclerView.class)).perform( + RecyclerViewActions.scrollTo( + hasDescendant(withText(text)))); + } + else + { + onView(withText(text)).perform(scrollTo()); + } + } + catch (PerformException e) + { + //ignored + } + } + + public static void verifyDisplayGraphs() + { + verifyDisplaysView("HistoryCard"); + verifyDisplaysView("ScoreCard"); + } + + public static void verifyDisplaysText(String text) + { + scrollToText(text); + onView(withText(text)).check(matches(isEnabled())); + } + + private static void verifyDisplaysView(String className) + { + onView(withClassName(endsWith(className))).check(matches(isEnabled())); + } + + public static void verifyDoesNotDisplayText(String text) + { + onView(withText(text)).check(doesNotExist()); + } + + public static void verifyOpensWebsite(String url) throws Exception + { + assertTrue( + device.wait(Until.hasObject(By.pkg("com.android.chrome")), 5000)); + device.waitForIdle(); + assertTrue(device.findObject(new UiSelector().text(url)).exists()); + } +} diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/EditHabitSteps.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/EditHabitSteps.java new file mode 100644 index 000000000..9b4774427 --- /dev/null +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/EditHabitSteps.java @@ -0,0 +1,64 @@ +/* + * 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.acceptance.steps; + +import android.support.test.uiautomator.*; + +import org.isoron.uhabits.*; + +import static android.support.test.espresso.Espresso.*; +import static android.support.test.espresso.action.ViewActions.*; +import static android.support.test.espresso.matcher.ViewMatchers.*; +import static org.isoron.uhabits.BaseUIAutomatorTest.device; + +public class EditHabitSteps +{ + public static void clickSave() + { + onView(withId(R.id.buttonSave)).perform(click()); + } + + public static void pickFrequency(String freq) + { + onView(withId(R.id.spinner)).perform(click()); + device.findObject(By.text(freq)).click(); + } + + public static void pickColor(int color) + { + onView(withId(R.id.buttonPickColor)).perform(click()); + device.findObject(By.descStartsWith(String.format("Color %d", color))).click(); + } + + public static void typeName(String name) + { + typeTextWithId(R.id.tvName, name); + } + + public static void typeQuestion(String name) + { + typeTextWithId(R.id.tvDescription, name); + } + + private static void typeTextWithId(int id, String name) + { + onView(withId(id)).perform(clearText(), typeText(name)); + } +} diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/ListHabitsSteps.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/ListHabitsSteps.java new file mode 100644 index 000000000..f3328d146 --- /dev/null +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/acceptance/steps/ListHabitsSteps.java @@ -0,0 +1,161 @@ +/* + * 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.acceptance.steps; + +import android.support.test.espresso.*; +import android.support.test.uiautomator.*; +import android.view.*; + +import org.hamcrest.*; +import org.isoron.uhabits.R; +import org.isoron.uhabits.activities.habits.list.views.*; + +import java.util.*; + +import static android.support.test.InstrumentationRegistry.*; +import static android.support.test.espresso.Espresso.*; +import static android.support.test.espresso.action.ViewActions.*; +import static android.support.test.espresso.matcher.ViewMatchers.*; +import static org.hamcrest.CoreMatchers.*; +import static org.isoron.uhabits.BaseUIAutomatorTest.device; +import static org.isoron.uhabits.acceptance.steps.CommonSteps.clickText; + +public abstract class ListHabitsSteps +{ + public static void clickMenu(MenuItem item) + { + switch (item) + { + case ABOUT: + clickTextInsideOverflowMenu(R.string.about); + break; + + case HELP: + clickTextInsideOverflowMenu(R.string.help); + break; + + case SETTINGS: + clickTextInsideOverflowMenu(R.string.settings); + break; + + case CREATE_HABIT: + clickViewWithId(R.id.actionAdd); + break; + + case EDIT_HABIT: + clickViewWithId(R.id.action_edit_habit); + break; + + case DELETE: + clickTextInsideOverflowMenu(R.string.delete); + break; + + case ARCHIVE: + clickTextInsideOverflowMenu(R.string.archive); + break; + + case UNARCHIVE: + clickTextInsideOverflowMenu(R.string.unarchive); + break; + + case HIDE_ARCHIVED: + clickViewWithId(R.id.action_filter); + clickText(R.string.hide_archived); + break; + } + } + + private static void clickTextInsideOverflowMenu(int id) + { + UiObject toolbar = device.findObject( + new UiSelector().resourceId("org.isoron.uhabits:id/toolbar")); + if(toolbar.exists()) + { + onView(allOf(withContentDescription("More options"), withParent + (withParent(withId(R.id.toolbar))))).perform(click()); + } + else + { + openActionBarOverflowOrOptionsMenu(getTargetContext()); + } + + onView(withText(id)).perform(click()); + } + + private static void clickViewWithId(int id) + { + onView(withId(id)).perform(click()); + } + + private static ViewAction longClickEveryDescendantWithClass(Class cls) + { + return new ViewAction() + { + + @Override + public Matcher getConstraints() + { + return isEnabled(); + } + + @Override + public String getDescription() + { + return "perform on children"; + } + + @Override + public void perform(UiController uiController, View view) + { + LinkedList stack = new LinkedList<>(); + if (view instanceof ViewGroup) stack.push((ViewGroup) view); + + while (!stack.isEmpty()) + { + ViewGroup vg = stack.pop(); + for (int i = 0; i < vg.getChildCount(); i++) + { + View v = vg.getChildAt(i); + if (v instanceof ViewGroup) stack.push((ViewGroup) v); + if (cls.isInstance(v)) + { + v.performLongClick(); + uiController.loopMainThreadUntilIdle(); + } + } + } + } + }; + } + + public static void longPressCheckmarks(String habit) + { + CommonSteps.scrollToText(habit); + onView(allOf(hasDescendant(withText(habit)), + withClassName(endsWith("HabitCardView")))).perform( + longClickEveryDescendantWithClass(CheckmarkButtonView.class)); + } + + public enum MenuItem + { + ABOUT, HELP, SETTINGS, EDIT_HABIT, DELETE, ARCHIVE, HIDE_ARCHIVED, + UNARCHIVE, CREATE_HABIT + } +} diff --git a/app/src/androidTest/java/org/isoron/uhabits/activities/common/views/BarChartTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/BarChartTest.java similarity index 96% rename from app/src/androidTest/java/org/isoron/uhabits/activities/common/views/BarChartTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/BarChartTest.java index c208cadff..579cd08bb 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/activities/common/views/BarChartTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/BarChartTest.java @@ -23,7 +23,8 @@ import android.support.test.filters.*; import android.support.test.runner.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.utils.*; import org.isoron.uhabits.utils.*; import org.junit.*; import org.junit.runner.*; diff --git a/app/src/androidTest/java/org/isoron/uhabits/activities/common/views/FrequencyChartTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/FrequencyChartTest.java similarity index 96% rename from app/src/androidTest/java/org/isoron/uhabits/activities/common/views/FrequencyChartTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/FrequencyChartTest.java index 2bdf05438..69560a38c 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/activities/common/views/FrequencyChartTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/FrequencyChartTest.java @@ -19,11 +19,11 @@ package org.isoron.uhabits.activities.common.views; +import android.support.test.filters.*; import android.support.test.runner.*; -import android.test.suitebuilder.annotation.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.utils.*; import org.junit.*; import org.junit.runner.*; diff --git a/app/src/androidTest/java/org/isoron/uhabits/activities/common/views/HistoryChartTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/HistoryChartTest.java similarity index 97% rename from app/src/androidTest/java/org/isoron/uhabits/activities/common/views/HistoryChartTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/HistoryChartTest.java index 05a2c5a06..cbcfa350f 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/activities/common/views/HistoryChartTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/HistoryChartTest.java @@ -19,11 +19,11 @@ package org.isoron.uhabits.activities.common.views; +import android.support.test.filters.*; import android.support.test.runner.*; -import android.test.suitebuilder.annotation.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.utils.*; import org.junit.*; import org.junit.runner.*; diff --git a/app/src/androidTest/java/org/isoron/uhabits/activities/common/views/RingViewTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/RingViewTest.java similarity index 100% rename from app/src/androidTest/java/org/isoron/uhabits/activities/common/views/RingViewTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/RingViewTest.java diff --git a/app/src/androidTest/java/org/isoron/uhabits/activities/common/views/ScoreChartTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/ScoreChartTest.java similarity index 97% rename from app/src/androidTest/java/org/isoron/uhabits/activities/common/views/ScoreChartTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/ScoreChartTest.java index 8c5327503..43eb981db 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/activities/common/views/ScoreChartTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/ScoreChartTest.java @@ -23,7 +23,8 @@ import android.support.test.runner.*; import android.test.suitebuilder.annotation.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.utils.*; import org.isoron.uhabits.utils.*; import org.junit.*; import org.junit.runner.*; diff --git a/app/src/androidTest/java/org/isoron/uhabits/activities/common/views/StreakChartTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/StreakChartTest.java similarity index 98% rename from app/src/androidTest/java/org/isoron/uhabits/activities/common/views/StreakChartTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/StreakChartTest.java index 47b9e7c04..da2df3138 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/activities/common/views/StreakChartTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/common/views/StreakChartTest.java @@ -23,7 +23,7 @@ import android.support.test.runner.*; import android.test.suitebuilder.annotation.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.utils.*; import org.junit.*; import org.junit.runner.*; diff --git a/app/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonViewTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonViewTest.java similarity index 98% rename from app/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonViewTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonViewTest.java index a3f933c4f..e096922a0 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonViewTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonViewTest.java @@ -23,7 +23,7 @@ import android.support.test.runner.*; import android.test.suitebuilder.annotation.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.utils.*; import org.junit.*; import org.junit.runner.*; diff --git a/app/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelViewTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelViewTest.java similarity index 96% rename from app/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelViewTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelViewTest.java index 22b69754a..eb7439847 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelViewTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelViewTest.java @@ -22,8 +22,8 @@ package org.isoron.uhabits.activities.habits.list.views; import android.support.test.runner.AndroidJUnit4; import android.test.suitebuilder.annotation.*; -import org.isoron.uhabits.models.Checkmark; -import org.isoron.uhabits.models.Habit; +import org.isoron.uhabits.core.models.Checkmark; +import org.isoron.uhabits.core.models.Habit; import org.isoron.uhabits.BaseViewTest; import org.isoron.uhabits.utils.ColorUtils; import org.junit.Before; diff --git a/app/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HabitCardViewTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HabitCardViewTest.java similarity index 97% rename from app/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HabitCardViewTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HabitCardViewTest.java index 172ce43e5..651e89f91 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HabitCardViewTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HabitCardViewTest.java @@ -23,8 +23,8 @@ import android.support.test.runner.*; import android.test.suitebuilder.annotation.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.utils.*; import org.junit.*; import org.junit.runner.*; diff --git a/app/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 similarity index 94% rename from app/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HeaderViewTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HeaderViewTest.java index d60299766..898bdab0e 100644 --- a/app/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 @@ -23,8 +23,8 @@ import android.support.test.filters.*; import android.support.test.runner.*; import org.isoron.uhabits.*; +import org.isoron.uhabits.core.utils.*; import org.isoron.uhabits.preferences.*; -import org.isoron.uhabits.utils.*; import org.junit.*; import org.junit.runner.*; @@ -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/app/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HintViewTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HintViewTest.java similarity index 95% rename from app/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HintViewTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HintViewTest.java index 7c04cd1f1..9f8e5525a 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HintViewTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/HintViewTest.java @@ -23,12 +23,12 @@ import android.support.test.runner.*; import android.test.suitebuilder.annotation.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.activities.habits.list.model.*; +import org.isoron.uhabits.core.ui.screens.habits.list.*; import org.junit.*; import org.junit.runner.*; -import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.CoreMatchers.*; +import static org.hamcrest.MatcherAssert.assertThat; import static org.mockito.Mockito.*; @RunWith(AndroidJUnit4.class) diff --git a/app/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonViewTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonViewTest.java similarity index 100% rename from app/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonViewTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonViewTest.java diff --git a/app/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/FrequencyCardTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/FrequencyCardTest.java similarity index 95% rename from app/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/FrequencyCardTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/FrequencyCardTest.java index 2e37d1c10..9b0b82efa 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/FrequencyCardTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/FrequencyCardTest.java @@ -24,7 +24,7 @@ import android.test.suitebuilder.annotation.*; import android.view.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.junit.*; import org.junit.runner.*; @@ -43,7 +43,7 @@ public class FrequencyCardTest extends BaseViewTest public void setUp() { super.setUp(); - habit = fixtures.createLongHabit(); + habit = fixtures.createLongHabit(); view = (FrequencyCard) LayoutInflater .from(targetContext) diff --git a/app/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/HistoryCardTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/HistoryCardTest.java similarity index 83% rename from app/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/HistoryCardTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/HistoryCardTest.java index 68c6cc63c..91bffd89a 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/HistoryCardTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/HistoryCardTest.java @@ -24,14 +24,10 @@ import android.test.suitebuilder.annotation.*; import android.view.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.junit.*; import org.junit.runner.*; -import java.util.*; - -import static org.isoron.uhabits.utils.DateUtils.*; - @RunWith(AndroidJUnit4.class) @MediumTest public class HistoryCardTest extends BaseViewTest @@ -48,11 +44,6 @@ public class HistoryCardTest extends BaseViewTest { super.setUp(); habit = fixtures.createLongHabit(); - List reps = habit - .getRepetitions() - .getByInterval(getStartOfToday() - 30 * millisecondsInOneDay, - getStartOfToday()); - int[] values = habit.getCheckmarks().getAllValues(); view = (HistoryCard) LayoutInflater .from(targetContext) diff --git a/app/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/OverviewCardTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/OverviewCardTest.java similarity index 97% rename from app/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/OverviewCardTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/OverviewCardTest.java index 0e54b7adf..399cdf8a0 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/OverviewCardTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/OverviewCardTest.java @@ -24,7 +24,7 @@ import android.test.suitebuilder.annotation.*; import android.view.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.junit.*; import org.junit.runner.*; diff --git a/app/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/ScoreCardTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/ScoreCardTest.java similarity index 97% rename from app/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/ScoreCardTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/ScoreCardTest.java index c93d0b1bd..16f3ae61b 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/ScoreCardTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/ScoreCardTest.java @@ -24,7 +24,7 @@ import android.test.suitebuilder.annotation.*; import android.view.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.junit.*; import org.junit.runner.*; diff --git a/app/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/StreakCardTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/StreakCardTest.java similarity index 97% rename from app/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/StreakCardTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/StreakCardTest.java index ae12e3819..ef1a2a9a1 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/StreakCardTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/StreakCardTest.java @@ -24,7 +24,7 @@ import android.test.suitebuilder.annotation.*; import android.view.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.junit.*; import org.junit.runner.*; diff --git a/app/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/SubtitleCardTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/SubtitleCardTest.java similarity index 97% rename from app/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/SubtitleCardTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/SubtitleCardTest.java index 09cfb02b2..74564d8c6 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/SubtitleCardTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/activities/habits/show/views/SubtitleCardTest.java @@ -24,7 +24,7 @@ import android.test.suitebuilder.annotation.*; import android.view.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.junit.*; import org.junit.runner.*; diff --git a/uhabits-android/src/androidTest/java/org/isoron/uhabits/integration/SavedStateTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/integration/SavedStateTest.java new file mode 100644 index 000000000..8bc086e2f --- /dev/null +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/integration/SavedStateTest.java @@ -0,0 +1,48 @@ +/* + * 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.integration; + +import android.support.test.filters.*; + +import org.isoron.uhabits.*; +import org.isoron.uhabits.activities.about.*; +import org.isoron.uhabits.activities.habits.list.*; +import org.junit.*; + +import static java.lang.Thread.*; + +@LargeTest +public class SavedStateTest extends BaseUIAutomatorTest +{ + /** + * Make sure that the main activity can be recreated by using + * BundleSavedState after being destroyed. See bug: + * https://github.com/iSoron/uhabits/issues/287 + */ + @Test + public void testBundleSavedState() throws Exception + { + startActivity(ListHabitsActivity.class); + device.waitForIdle(); + startActivity(AboutActivity.class); + sleep(1000); + device.pressBack(); + } +} diff --git a/app/src/androidTest/java/org/isoron/uhabits/io/HabitsCSVExporterTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/io/HabitsCSVExporterTest.java similarity index 96% rename from app/src/androidTest/java/org/isoron/uhabits/io/HabitsCSVExporterTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/io/HabitsCSVExporterTest.java index 4a82c1239..a2a63680c 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/io/HabitsCSVExporterTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/io/HabitsCSVExporterTest.java @@ -24,9 +24,10 @@ import android.support.test.*; import android.support.test.runner.*; import android.test.suitebuilder.annotation.*; +import org.isoron.androidbase.utils.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.io.*; +import org.isoron.uhabits.core.models.*; import org.junit.*; import org.junit.runner.*; @@ -34,8 +35,6 @@ import java.io.*; import java.util.*; import java.util.zip.*; -import static junit.framework.Assert.*; - @RunWith(AndroidJUnit4.class) @MediumTest public class HabitsCSVExporterTest extends BaseAndroidTest diff --git a/app/src/androidTest/java/org/isoron/uhabits/io/ImportTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/io/ImportTest.java similarity index 97% rename from app/src/androidTest/java/org/isoron/uhabits/io/ImportTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/io/ImportTest.java index 343e64ea2..51a35e52c 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/io/ImportTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/io/ImportTest.java @@ -24,9 +24,10 @@ import android.support.test.*; import android.support.test.runner.*; import android.test.suitebuilder.annotation.*; +import org.isoron.androidbase.utils.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.utils.*; import org.junit.*; import org.junit.runner.*; diff --git a/app/src/androidTest/java/org/isoron/uhabits/models/HabitListTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/models/HabitListTest.java similarity index 98% rename from app/src/androidTest/java/org/isoron/uhabits/models/HabitListTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/models/HabitListTest.java index 92f71a3f4..82d083bb3 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/models/HabitListTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/models/HabitListTest.java @@ -24,17 +24,17 @@ import android.test.suitebuilder.annotation.*; import org.hamcrest.*; import org.isoron.uhabits.*; +import org.isoron.uhabits.core.models.*; import org.junit.*; import org.junit.runner.*; import java.io.*; import java.util.*; -import static junit.framework.Assert.*; import static org.hamcrest.CoreMatchers.*; import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.core.IsEqual.equalTo; -import static org.isoron.uhabits.models.HabitList.Order.*; +import static org.isoron.uhabits.core.models.HabitList.Order.*; @SuppressWarnings("JavaDoc") @RunWith(AndroidJUnit4.class) diff --git a/app/src/androidTest/java/org/isoron/uhabits/models/sqlite/HabitRecordTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/models/sqlite/HabitRecordTest.java similarity index 98% rename from app/src/androidTest/java/org/isoron/uhabits/models/sqlite/HabitRecordTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/models/sqlite/HabitRecordTest.java index d701056df..872b3382c 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/models/sqlite/HabitRecordTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/models/sqlite/HabitRecordTest.java @@ -23,7 +23,7 @@ import android.support.test.runner.*; import android.test.suitebuilder.annotation.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.models.sqlite.records.*; import org.junit.*; import org.junit.runner.*; diff --git a/app/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteCheckmarkListTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteCheckmarkListTest.java similarity index 97% rename from app/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteCheckmarkListTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteCheckmarkListTest.java index f4f779950..1efac3177 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteCheckmarkListTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteCheckmarkListTest.java @@ -25,16 +25,16 @@ import android.test.suitebuilder.annotation.*; import com.activeandroid.query.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.utils.*; import org.isoron.uhabits.models.sqlite.records.*; -import org.isoron.uhabits.utils.*; import org.junit.*; import org.junit.runner.*; import java.util.*; -import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.CoreMatchers.*; +import static org.hamcrest.MatcherAssert.*; @RunWith(AndroidJUnit4.class) @MediumTest diff --git a/app/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteHabitListTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteHabitListTest.java similarity index 98% rename from app/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteHabitListTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteHabitListTest.java index 5308fc61c..a7b308c73 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteHabitListTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteHabitListTest.java @@ -25,7 +25,8 @@ import android.test.suitebuilder.annotation.*; import com.activeandroid.query.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.models.sqlite.*; import org.isoron.uhabits.models.sqlite.records.*; import org.junit.*; import org.junit.rules.*; @@ -33,7 +34,6 @@ import org.junit.runner.*; import java.util.*; -import static junit.framework.Assert.*; import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.core.IsEqual.*; diff --git a/app/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteRepetitionListTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteRepetitionListTest.java similarity index 93% rename from app/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteRepetitionListTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteRepetitionListTest.java index 59bd4889c..dd3657a62 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteRepetitionListTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteRepetitionListTest.java @@ -26,18 +26,17 @@ import android.test.suitebuilder.annotation.*; import com.activeandroid.query.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.utils.*; import org.isoron.uhabits.models.sqlite.records.*; -import org.isoron.uhabits.utils.*; import org.junit.*; import org.junit.runner.*; import java.util.*; -import static junit.framework.Assert.*; -import static org.hamcrest.CoreMatchers.*; -import static org.hamcrest.MatcherAssert.*; -import static org.isoron.uhabits.models.Checkmark.*; +import static android.support.test.espresso.matcher.ViewMatchers.assertThat; +import static org.hamcrest.core.IsEqual.equalTo; +import static org.isoron.uhabits.core.models.Checkmark.CHECKED_EXPLICITLY; @RunWith(AndroidJUnit4.class) @MediumTest diff --git a/app/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteScoreListTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteScoreListTest.java similarity index 97% rename from app/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteScoreListTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteScoreListTest.java index a4214933c..3108ab96a 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteScoreListTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/models/sqlite/SQLiteScoreListTest.java @@ -25,9 +25,9 @@ import android.test.suitebuilder.annotation.*; import com.activeandroid.query.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.utils.*; import org.isoron.uhabits.models.sqlite.records.*; -import org.isoron.uhabits.utils.*; import org.junit.*; import org.junit.runner.*; diff --git a/app/src/androidTest/java/org/isoron/uhabits/performance/PerformanceTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/performance/PerformanceTest.java similarity index 97% rename from app/src/androidTest/java/org/isoron/uhabits/performance/PerformanceTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/performance/PerformanceTest.java index 765c4cd3a..b6e6ee6d8 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/performance/PerformanceTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/performance/PerformanceTest.java @@ -22,7 +22,7 @@ package org.isoron.uhabits.performance; import android.support.test.filters.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.junit.*; @MediumTest diff --git a/app/src/androidTest/java/org/isoron/uhabits/receivers/PebbleReceiverTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/receivers/PebbleReceiverTest.java similarity index 99% rename from app/src/androidTest/java/org/isoron/uhabits/receivers/PebbleReceiverTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/receivers/PebbleReceiverTest.java index 631f2d396..a4157ee71 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/receivers/PebbleReceiverTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/receivers/PebbleReceiverTest.java @@ -28,7 +28,7 @@ import com.getpebble.android.kit.*; import com.getpebble.android.kit.util.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.receivers.*; import org.json.*; import org.junit.*; @@ -42,7 +42,6 @@ import static org.hamcrest.core.IsEqual.*; @MediumTest public class PebbleReceiverTest extends BaseAndroidTest { - private Habit habit1; private Habit habit2; diff --git a/app/src/androidTest/java/org/isoron/uhabits/tasks/ExportCSVTaskTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/tasks/ExportCSVTaskTest.java similarity index 87% rename from app/src/androidTest/java/org/isoron/uhabits/tasks/ExportCSVTaskTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/tasks/ExportCSVTaskTest.java index aa999d7b3..2c268b4f8 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/tasks/ExportCSVTaskTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/tasks/ExportCSVTaskTest.java @@ -23,14 +23,14 @@ import android.support.test.runner.*; import android.test.suitebuilder.annotation.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.tasks.*; import org.junit.*; import org.junit.runner.*; import java.io.*; import java.util.*; -import static junit.framework.Assert.*; import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.CoreMatchers.*; import static org.hamcrest.core.IsNot.not; @@ -54,9 +54,11 @@ public class ExportCSVTaskTest extends BaseAndroidTest List selected = new LinkedList<>(); for (Habit h : habitList) selected.add(h); + File outputDir = baseSystem.getFilesDir("CSV"); + assertNotNull(outputDir); taskRunner.execute( - new ExportCSVTask(targetContext,habitList, selected, archiveFilename -> { + new ExportCSVTask(habitList, selected, outputDir, archiveFilename -> { assertThat(archiveFilename, is(not(nullValue()))); File f = new File(archiveFilename); assertTrue(f.exists()); diff --git a/app/src/androidTest/java/org/isoron/uhabits/tasks/ExportDBTaskTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/tasks/ExportDBTaskTest.java similarity index 74% rename from app/src/androidTest/java/org/isoron/uhabits/tasks/ExportDBTaskTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/tasks/ExportDBTaskTest.java index 76f5e2315..71ac1ffb4 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/tasks/ExportDBTaskTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/tasks/ExportDBTaskTest.java @@ -28,15 +28,11 @@ import org.junit.runner.*; import java.io.*; -import static junit.framework.Assert.*; -import static org.hamcrest.MatcherAssert.*; -import static org.hamcrest.CoreMatchers.*; -import static org.hamcrest.core.IsNot.not; - @RunWith(AndroidJUnit4.class) @MediumTest public class ExportDBTaskTest extends BaseAndroidTest { + @Override @Before public void setUp() { @@ -46,13 +42,13 @@ public class ExportDBTaskTest extends BaseAndroidTest @Test public void testExportCSV() throws Throwable { - ExportDBTask task = new ExportDBTask(targetContext, filename -> { - assertThat(filename, is(not(nullValue()))); - - File f = new File(filename); - assertTrue(f.exists()); - assertTrue(f.canRead()); - }); + ExportDBTask task = + new ExportDBTask(targetContext, baseSystem, filename -> { + assertNotNull(filename); + File f = new File(filename); + assertTrue(f.exists()); + assertTrue(f.canRead()); + }); taskRunner.execute(task); } diff --git a/app/src/test/java/org/isoron/uhabits/utils/ReminderSchedulerTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/utils/ReminderSchedulerTest.java similarity index 82% rename from app/src/test/java/org/isoron/uhabits/utils/ReminderSchedulerTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/utils/ReminderSchedulerTest.java index 073ebd291..d409121f1 100644 --- a/app/src/test/java/org/isoron/uhabits/utils/ReminderSchedulerTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/utils/ReminderSchedulerTest.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. * @@ -22,22 +22,21 @@ package org.isoron.uhabits.utils; import android.app.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.commands.*; +import org.isoron.uhabits.core.commands.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.utils.*; import org.isoron.uhabits.intents.*; -import org.isoron.uhabits.models.*; import org.junit.*; import java.util.*; +import static java.util.Arrays.asList; import static org.mockito.Mockito.*; -@SuppressWarnings("JavaDoc") -public class ReminderSchedulerTest extends BaseUnitTest +public class ReminderSchedulerTest extends BaseAndroidTest { private Habit habit; - private PendingIntent intent; - private ReminderScheduler reminderScheduler; private HabitLogger logger; @@ -53,11 +52,11 @@ public class ReminderSchedulerTest extends BaseUnitTest public void setUp() { super.setUp(); - intent = mock(PendingIntent.class); logger = mock(HabitLogger.class); - pendingIntentFactory = mock(PendingIntentFactory.class); intentScheduler = mock(IntentScheduler.class); commandRunner = mock(CommandRunner.class); + pendingIntentFactory = + new PendingIntentFactory(targetContext, new IntentFactory()); reminderScheduler = new ReminderScheduler(pendingIntentFactory, intentScheduler, logger, @@ -92,26 +91,23 @@ public class ReminderSchedulerTest extends BaseUnitTest } @Test - public void testSchedule_list() + public void testScheduleAll() { long now = timestamp(2015, 1, 26, 13, 0); DateUtils.setFixedLocalTime(now); Habit h1 = fixtures.createEmptyHabit(); - h1.setReminder(new Reminder(8, 30, WeekdayList.EVERY_DAY)); - habitList.add(h1); - Habit h2 = fixtures.createEmptyHabit(); - h2.setReminder(new Reminder(18, 30, WeekdayList.EVERY_DAY)); - habitList.add(h2); - Habit h3 = fixtures.createEmptyHabit(); - habitList.add(h3); + h1.setReminder(new Reminder(8, 30, WeekdayList.EVERY_DAY)); + h2.setReminder(new Reminder(18, 30, WeekdayList.EVERY_DAY)); + h3.setReminder(null); + habitList.update(asList(h1, h2, h3)); reminderScheduler.scheduleAll(); - verify(intentScheduler).schedule(timestamp(2015, 1, 27, 12, 30), null); - verify(intentScheduler).schedule(timestamp(2015, 1, 26, 22, 30), null); + verify(intentScheduler).schedule(eq(timestamp(2015, 1, 27, 12, 30)), any()); + verify(intentScheduler).schedule(eq(timestamp(2015, 1, 26, 22, 30)), any()); verifyNoMoreInteractions(intentScheduler); } @@ -146,15 +142,13 @@ public class ReminderSchedulerTest extends BaseUnitTest long expectedCheckmarkTime, long expectedReminderTime) { - when(pendingIntentFactory.showReminder(habit, expectedReminderTime, - expectedCheckmarkTime)).thenReturn(intent); + PendingIntent intent = + pendingIntentFactory.showReminder(habit, expectedReminderTime, + expectedCheckmarkTime); reminderScheduler.schedule(habit, atTime); verify(logger).logReminderScheduled(habit, expectedReminderTime); - - verify(pendingIntentFactory).showReminder(habit, expectedReminderTime, - expectedCheckmarkTime); verify(intentScheduler).schedule(expectedReminderTime, intent); } } diff --git a/app/src/androidTest/java/org/isoron/uhabits/widgets/CheckmarkWidgetTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/CheckmarkWidgetTest.java similarity index 96% rename from app/src/androidTest/java/org/isoron/uhabits/widgets/CheckmarkWidgetTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/CheckmarkWidgetTest.java index 9e25e12ef..130ec3b68 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/widgets/CheckmarkWidgetTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/CheckmarkWidgetTest.java @@ -24,13 +24,13 @@ import android.test.suitebuilder.annotation.*; import android.widget.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.junit.*; import org.junit.runner.*; import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.CoreMatchers.*; -import static org.isoron.uhabits.models.Checkmark.*; +import static org.isoron.uhabits.core.models.Checkmark.*; @RunWith(AndroidJUnit4.class) @MediumTest diff --git a/app/src/androidTest/java/org/isoron/uhabits/widgets/FrequencyWidgetTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/FrequencyWidgetTest.java similarity index 96% rename from app/src/androidTest/java/org/isoron/uhabits/widgets/FrequencyWidgetTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/FrequencyWidgetTest.java index ac361fd96..dd9d4304c 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/widgets/FrequencyWidgetTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/FrequencyWidgetTest.java @@ -24,8 +24,7 @@ import android.test.suitebuilder.annotation.*; import android.widget.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.widgets.*; +import org.isoron.uhabits.core.models.*; import org.junit.*; import org.junit.runner.*; diff --git a/app/src/androidTest/java/org/isoron/uhabits/widgets/HistoryWidgetTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/HistoryWidgetTest.java similarity index 96% rename from app/src/androidTest/java/org/isoron/uhabits/widgets/HistoryWidgetTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/HistoryWidgetTest.java index c1adc6882..61c8c3528 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/widgets/HistoryWidgetTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/HistoryWidgetTest.java @@ -24,8 +24,7 @@ import android.test.suitebuilder.annotation.*; import android.widget.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.widgets.*; +import org.isoron.uhabits.core.models.*; import org.junit.*; import org.junit.runner.*; diff --git a/app/src/androidTest/java/org/isoron/uhabits/widgets/ScoreWidgetTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/ScoreWidgetTest.java similarity index 97% rename from app/src/androidTest/java/org/isoron/uhabits/widgets/ScoreWidgetTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/ScoreWidgetTest.java index f4d5074b6..82f2c451f 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/widgets/ScoreWidgetTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/ScoreWidgetTest.java @@ -24,7 +24,7 @@ import android.test.suitebuilder.annotation.*; import android.widget.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.junit.*; import org.junit.runner.*; diff --git a/app/src/androidTest/java/org/isoron/uhabits/widgets/StreakWidgetTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/StreakWidgetTest.java similarity index 97% rename from app/src/androidTest/java/org/isoron/uhabits/widgets/StreakWidgetTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/StreakWidgetTest.java index 1c7639bb2..eb4cbbe90 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/widgets/StreakWidgetTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/StreakWidgetTest.java @@ -24,7 +24,7 @@ import android.test.suitebuilder.annotation.*; import android.widget.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.junit.*; import org.junit.runner.*; diff --git a/app/src/androidTest/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetViewTest.java b/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetViewTest.java similarity index 98% rename from app/src/androidTest/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetViewTest.java rename to uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetViewTest.java index d339fb3d6..7ff714856 100644 --- a/app/src/androidTest/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetViewTest.java +++ b/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetViewTest.java @@ -23,7 +23,7 @@ import android.support.test.runner.*; import android.test.suitebuilder.annotation.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.utils.*; import org.junit.*; import org.junit.runner.*; diff --git a/app/src/main/AndroidManifest.xml b/uhabits-android/src/main/AndroidManifest.xml similarity index 97% rename from app/src/main/AndroidManifest.xml rename to uhabits-android/src/main/AndroidManifest.xml index f08304d71..ac3389550 100644 --- a/app/src/main/AndroidManifest.xml +++ b/uhabits-android/src/main/AndroidManifest.xml @@ -25,14 +25,6 @@ - - - - diff --git a/app/src/main/assets/cacert.pem b/uhabits-android/src/main/assets/cacert.pem similarity index 100% rename from app/src/main/assets/cacert.pem rename to uhabits-android/src/main/assets/cacert.pem diff --git a/app/src/main/assets/fontawesome-webfont.ttf b/uhabits-android/src/main/assets/fontawesome-webfont.ttf similarity index 100% rename from app/src/main/assets/fontawesome-webfont.ttf rename to uhabits-android/src/main/assets/fontawesome-webfont.ttf diff --git a/app/src/main/assets/migrations/10.sql b/uhabits-android/src/main/assets/migrations/10.sql similarity index 100% rename from app/src/main/assets/migrations/10.sql rename to uhabits-android/src/main/assets/migrations/10.sql diff --git a/app/src/main/assets/migrations/11.sql b/uhabits-android/src/main/assets/migrations/11.sql similarity index 100% rename from app/src/main/assets/migrations/11.sql rename to uhabits-android/src/main/assets/migrations/11.sql diff --git a/app/src/main/assets/migrations/12.sql b/uhabits-android/src/main/assets/migrations/12.sql similarity index 100% rename from app/src/main/assets/migrations/12.sql rename to uhabits-android/src/main/assets/migrations/12.sql diff --git a/app/src/main/assets/migrations/13.sql b/uhabits-android/src/main/assets/migrations/13.sql similarity index 100% rename from app/src/main/assets/migrations/13.sql rename to uhabits-android/src/main/assets/migrations/13.sql diff --git a/app/src/main/assets/migrations/14.sql b/uhabits-android/src/main/assets/migrations/14.sql similarity index 100% rename from app/src/main/assets/migrations/14.sql rename to uhabits-android/src/main/assets/migrations/14.sql diff --git a/app/src/main/assets/migrations/15.sql b/uhabits-android/src/main/assets/migrations/15.sql similarity index 100% rename from app/src/main/assets/migrations/15.sql rename to uhabits-android/src/main/assets/migrations/15.sql diff --git a/app/src/main/assets/migrations/16.sql b/uhabits-android/src/main/assets/migrations/16.sql similarity index 100% rename from app/src/main/assets/migrations/16.sql rename to uhabits-android/src/main/assets/migrations/16.sql diff --git a/app/src/main/assets/migrations/17.sql b/uhabits-android/src/main/assets/migrations/17.sql similarity index 100% rename from app/src/main/assets/migrations/17.sql rename to uhabits-android/src/main/assets/migrations/17.sql diff --git a/app/src/main/assets/migrations/18.sql b/uhabits-android/src/main/assets/migrations/18.sql similarity index 100% rename from app/src/main/assets/migrations/18.sql rename to uhabits-android/src/main/assets/migrations/18.sql diff --git a/app/src/main/assets/migrations/5.sql b/uhabits-android/src/main/assets/migrations/5.sql similarity index 100% rename from app/src/main/assets/migrations/5.sql rename to uhabits-android/src/main/assets/migrations/5.sql diff --git a/app/src/main/assets/migrations/6.sql b/uhabits-android/src/main/assets/migrations/6.sql similarity index 100% rename from app/src/main/assets/migrations/6.sql rename to uhabits-android/src/main/assets/migrations/6.sql diff --git a/app/src/main/assets/migrations/7.sql b/uhabits-android/src/main/assets/migrations/7.sql similarity index 100% rename from app/src/main/assets/migrations/7.sql rename to uhabits-android/src/main/assets/migrations/7.sql diff --git a/app/src/main/ic_launcher-web.png b/uhabits-android/src/main/ic_launcher-web.png similarity index 100% rename from app/src/main/ic_launcher-web.png rename to uhabits-android/src/main/ic_launcher-web.png diff --git a/app/src/main/ic_small_widget_preview-web.png b/uhabits-android/src/main/ic_small_widget_preview-web.png similarity index 100% rename from app/src/main/ic_small_widget_preview-web.png rename to uhabits-android/src/main/ic_small_widget_preview-web.png diff --git a/app/src/main/java/com/android/colorpicker/ColorPickerDialog.java b/uhabits-android/src/main/java/com/android/colorpicker/ColorPickerDialog.java similarity index 100% rename from app/src/main/java/com/android/colorpicker/ColorPickerDialog.java rename to uhabits-android/src/main/java/com/android/colorpicker/ColorPickerDialog.java diff --git a/app/src/main/java/com/android/colorpicker/ColorPickerPalette.java b/uhabits-android/src/main/java/com/android/colorpicker/ColorPickerPalette.java similarity index 100% rename from app/src/main/java/com/android/colorpicker/ColorPickerPalette.java rename to uhabits-android/src/main/java/com/android/colorpicker/ColorPickerPalette.java diff --git a/app/src/main/java/com/android/colorpicker/ColorPickerSwatch.java b/uhabits-android/src/main/java/com/android/colorpicker/ColorPickerSwatch.java similarity index 100% rename from app/src/main/java/com/android/colorpicker/ColorPickerSwatch.java rename to uhabits-android/src/main/java/com/android/colorpicker/ColorPickerSwatch.java diff --git a/app/src/main/java/com/android/colorpicker/ColorStateDrawable.java b/uhabits-android/src/main/java/com/android/colorpicker/ColorStateDrawable.java similarity index 100% rename from app/src/main/java/com/android/colorpicker/ColorStateDrawable.java rename to uhabits-android/src/main/java/com/android/colorpicker/ColorStateDrawable.java diff --git a/app/src/main/java/com/android/colorpicker/HsvColorComparator.java b/uhabits-android/src/main/java/com/android/colorpicker/HsvColorComparator.java similarity index 100% rename from app/src/main/java/com/android/colorpicker/HsvColorComparator.java rename to uhabits-android/src/main/java/com/android/colorpicker/HsvColorComparator.java diff --git a/app/src/main/java/com/android/datetimepicker/AccessibleLinearLayout.java b/uhabits-android/src/main/java/com/android/datetimepicker/AccessibleLinearLayout.java similarity index 100% rename from app/src/main/java/com/android/datetimepicker/AccessibleLinearLayout.java rename to uhabits-android/src/main/java/com/android/datetimepicker/AccessibleLinearLayout.java diff --git a/app/src/main/java/com/android/datetimepicker/AccessibleTextView.java b/uhabits-android/src/main/java/com/android/datetimepicker/AccessibleTextView.java similarity index 100% rename from app/src/main/java/com/android/datetimepicker/AccessibleTextView.java rename to uhabits-android/src/main/java/com/android/datetimepicker/AccessibleTextView.java diff --git a/app/src/main/java/com/android/datetimepicker/HapticFeedbackController.java b/uhabits-android/src/main/java/com/android/datetimepicker/HapticFeedbackController.java similarity index 100% rename from app/src/main/java/com/android/datetimepicker/HapticFeedbackController.java rename to uhabits-android/src/main/java/com/android/datetimepicker/HapticFeedbackController.java diff --git a/app/src/main/java/com/android/datetimepicker/Utils.java b/uhabits-android/src/main/java/com/android/datetimepicker/Utils.java similarity index 100% rename from app/src/main/java/com/android/datetimepicker/Utils.java rename to uhabits-android/src/main/java/com/android/datetimepicker/Utils.java diff --git a/app/src/main/java/com/android/datetimepicker/date/AccessibleDateAnimator.java b/uhabits-android/src/main/java/com/android/datetimepicker/date/AccessibleDateAnimator.java similarity index 100% rename from app/src/main/java/com/android/datetimepicker/date/AccessibleDateAnimator.java rename to uhabits-android/src/main/java/com/android/datetimepicker/date/AccessibleDateAnimator.java diff --git a/app/src/main/java/com/android/datetimepicker/date/DatePickerController.java b/uhabits-android/src/main/java/com/android/datetimepicker/date/DatePickerController.java similarity index 100% rename from app/src/main/java/com/android/datetimepicker/date/DatePickerController.java rename to uhabits-android/src/main/java/com/android/datetimepicker/date/DatePickerController.java diff --git a/app/src/main/java/com/android/datetimepicker/date/DatePickerDialog.java b/uhabits-android/src/main/java/com/android/datetimepicker/date/DatePickerDialog.java similarity index 100% rename from app/src/main/java/com/android/datetimepicker/date/DatePickerDialog.java rename to uhabits-android/src/main/java/com/android/datetimepicker/date/DatePickerDialog.java diff --git a/app/src/main/java/com/android/datetimepicker/date/DayPickerView.java b/uhabits-android/src/main/java/com/android/datetimepicker/date/DayPickerView.java similarity index 100% rename from app/src/main/java/com/android/datetimepicker/date/DayPickerView.java rename to uhabits-android/src/main/java/com/android/datetimepicker/date/DayPickerView.java diff --git a/app/src/main/java/com/android/datetimepicker/date/MonthAdapter.java b/uhabits-android/src/main/java/com/android/datetimepicker/date/MonthAdapter.java similarity index 100% rename from app/src/main/java/com/android/datetimepicker/date/MonthAdapter.java rename to uhabits-android/src/main/java/com/android/datetimepicker/date/MonthAdapter.java diff --git a/app/src/main/java/com/android/datetimepicker/date/MonthView.java b/uhabits-android/src/main/java/com/android/datetimepicker/date/MonthView.java similarity index 100% rename from app/src/main/java/com/android/datetimepicker/date/MonthView.java rename to uhabits-android/src/main/java/com/android/datetimepicker/date/MonthView.java diff --git a/app/src/main/java/com/android/datetimepicker/date/SimpleDayPickerView.java b/uhabits-android/src/main/java/com/android/datetimepicker/date/SimpleDayPickerView.java similarity index 100% rename from app/src/main/java/com/android/datetimepicker/date/SimpleDayPickerView.java rename to uhabits-android/src/main/java/com/android/datetimepicker/date/SimpleDayPickerView.java diff --git a/app/src/main/java/com/android/datetimepicker/date/SimpleMonthAdapter.java b/uhabits-android/src/main/java/com/android/datetimepicker/date/SimpleMonthAdapter.java similarity index 100% rename from app/src/main/java/com/android/datetimepicker/date/SimpleMonthAdapter.java rename to uhabits-android/src/main/java/com/android/datetimepicker/date/SimpleMonthAdapter.java diff --git a/app/src/main/java/com/android/datetimepicker/date/SimpleMonthView.java b/uhabits-android/src/main/java/com/android/datetimepicker/date/SimpleMonthView.java similarity index 100% rename from app/src/main/java/com/android/datetimepicker/date/SimpleMonthView.java rename to uhabits-android/src/main/java/com/android/datetimepicker/date/SimpleMonthView.java diff --git a/app/src/main/java/com/android/datetimepicker/date/TextViewWithCircularIndicator.java b/uhabits-android/src/main/java/com/android/datetimepicker/date/TextViewWithCircularIndicator.java similarity index 100% rename from app/src/main/java/com/android/datetimepicker/date/TextViewWithCircularIndicator.java rename to uhabits-android/src/main/java/com/android/datetimepicker/date/TextViewWithCircularIndicator.java diff --git a/app/src/main/java/com/android/datetimepicker/date/YearPickerView.java b/uhabits-android/src/main/java/com/android/datetimepicker/date/YearPickerView.java similarity index 100% rename from app/src/main/java/com/android/datetimepicker/date/YearPickerView.java rename to uhabits-android/src/main/java/com/android/datetimepicker/date/YearPickerView.java diff --git a/app/src/main/java/com/android/datetimepicker/time/AmPmCirclesView.java b/uhabits-android/src/main/java/com/android/datetimepicker/time/AmPmCirclesView.java similarity index 100% rename from app/src/main/java/com/android/datetimepicker/time/AmPmCirclesView.java rename to uhabits-android/src/main/java/com/android/datetimepicker/time/AmPmCirclesView.java diff --git a/app/src/main/java/com/android/datetimepicker/time/CircleView.java b/uhabits-android/src/main/java/com/android/datetimepicker/time/CircleView.java similarity index 100% rename from app/src/main/java/com/android/datetimepicker/time/CircleView.java rename to uhabits-android/src/main/java/com/android/datetimepicker/time/CircleView.java diff --git a/app/src/main/java/com/android/datetimepicker/time/RadialPickerLayout.java b/uhabits-android/src/main/java/com/android/datetimepicker/time/RadialPickerLayout.java similarity index 100% rename from app/src/main/java/com/android/datetimepicker/time/RadialPickerLayout.java rename to uhabits-android/src/main/java/com/android/datetimepicker/time/RadialPickerLayout.java diff --git a/app/src/main/java/com/android/datetimepicker/time/RadialSelectorView.java b/uhabits-android/src/main/java/com/android/datetimepicker/time/RadialSelectorView.java similarity index 100% rename from app/src/main/java/com/android/datetimepicker/time/RadialSelectorView.java rename to uhabits-android/src/main/java/com/android/datetimepicker/time/RadialSelectorView.java diff --git a/app/src/main/java/com/android/datetimepicker/time/RadialTextsView.java b/uhabits-android/src/main/java/com/android/datetimepicker/time/RadialTextsView.java similarity index 100% rename from app/src/main/java/com/android/datetimepicker/time/RadialTextsView.java rename to uhabits-android/src/main/java/com/android/datetimepicker/time/RadialTextsView.java diff --git a/app/src/main/java/com/android/datetimepicker/time/TimePickerDialog.java b/uhabits-android/src/main/java/com/android/datetimepicker/time/TimePickerDialog.java similarity index 100% rename from app/src/main/java/com/android/datetimepicker/time/TimePickerDialog.java rename to uhabits-android/src/main/java/com/android/datetimepicker/time/TimePickerDialog.java diff --git a/app/src/main/java/org/isoron/uhabits/AppContext.java b/uhabits-android/src/main/java/org/isoron/androidbase/AppContext.java similarity index 96% rename from app/src/main/java/org/isoron/uhabits/AppContext.java rename to uhabits-android/src/main/java/org/isoron/androidbase/AppContext.java index ebd0aab10..d7521e26d 100644 --- a/app/src/main/java/org/isoron/uhabits/AppContext.java +++ b/uhabits-android/src/main/java/org/isoron/androidbase/AppContext.java @@ -17,7 +17,7 @@ * with this program. If not, see . */ -package org.isoron.uhabits; +package org.isoron.androidbase; import java.lang.annotation.*; diff --git a/app/src/main/java/org/isoron/uhabits/AppModule.java b/uhabits-android/src/main/java/org/isoron/androidbase/AppModule.java similarity index 97% rename from app/src/main/java/org/isoron/uhabits/AppModule.java rename to uhabits-android/src/main/java/org/isoron/androidbase/AppModule.java index c5aa66c70..6e672994b 100644 --- a/app/src/main/java/org/isoron/uhabits/AppModule.java +++ b/uhabits-android/src/main/java/org/isoron/androidbase/AppModule.java @@ -17,7 +17,7 @@ * with this program. If not, see . */ -package org.isoron.uhabits; +package org.isoron.androidbase; import android.content.*; diff --git a/app/src/main/java/org/isoron/uhabits/activities/BaseSystem.java b/uhabits-android/src/main/java/org/isoron/androidbase/BaseSystem.java similarity index 68% rename from app/src/main/java/org/isoron/uhabits/activities/BaseSystem.java rename to uhabits-android/src/main/java/org/isoron/androidbase/BaseSystem.java index bacf911b3..6f6df9168 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/BaseSystem.java +++ b/uhabits-android/src/main/java/org/isoron/androidbase/BaseSystem.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. * @@ -17,15 +17,21 @@ * with this program. If not, see . */ -package org.isoron.uhabits.activities; +package org.isoron.androidbase; import android.content.*; import android.os.*; import android.support.annotation.*; +import android.support.v4.content.*; +import android.util.*; import android.view.*; +import org.isoron.androidbase.utils.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.*; +import org.isoron.uhabits.core.ui.screens.habits.list.*; +import org.isoron.uhabits.core.ui.screens.habits.show.*; +import org.isoron.uhabits.core.utils.*; import java.io.*; import java.lang.Process; @@ -41,17 +47,38 @@ import javax.inject.*; * a bug report, obtaining device information, or requesting runtime * permissions. */ -@ActivityScope -public class BaseSystem +@AppScope +public class BaseSystem implements CACertSSLContextProvider, + ListHabitsBehavior.System, + ShowHabitMenuBehavior.System { private Context context; + @Override + public Context getContext() + { + return context; + } + @Inject - public BaseSystem(@ActivityContext Context context) + public BaseSystem(@AppContext Context context) { this.context = context; } + @Nullable + public File getFilesDir(@Nullable String relativePath) + { + File externalFilesDirs[] = ContextCompat.getExternalFilesDirs(context, null); + if (externalFilesDirs == null) + { + Log.e("BaseSystem", "getFilesDir: getExternalFilesDirs returned null"); + return null; + } + + return FileUtils.getDir(externalFilesDirs, relativePath); + } + /** * Captures a bug report and saves it to a file in the SD card. *

@@ -62,24 +89,32 @@ public class BaseSystem * @return the generated file. * @throws IOException when I/O errors occur. */ + @Override @NonNull - public File dumpBugReportToFile() throws IOException + public void dumpBugReportToFile() { - String date = - DateFormats.getBackupDateFormat().format(DateUtils.getLocalTime()); + try + { + String date = DateFormats + .getBackupDateFormat() + .format(DateUtils.getLocalTime()); - if (context == null) throw new RuntimeException( - "application context should not be null"); - File dir = FileUtils.getFilesDir(context, "Logs"); - if (dir == null) throw new IOException("log dir should not be null"); + if (context == null) throw new IllegalStateException(); - File logFile = - new File(String.format("%s/Log %s.txt", dir.getPath(), date)); - FileWriter output = new FileWriter(logFile); - output.write(getBugReport()); - output.close(); + File dir = getFilesDir("Logs"); + if (dir == null) + throw new IOException("log dir should not be null"); - return logFile; + File logFile = + new File(String.format("%s/Log %s.txt", dir.getPath(), date)); + FileWriter output = new FileWriter(logFile); + output.write(getBugReport()); + output.close(); + } + catch (IOException e) + { + e.printStackTrace(); + } } /** @@ -90,6 +125,7 @@ public class BaseSystem * @return a String containing the bug report. * @throws IOException when any I/O error occur. */ + @Override @NonNull public String getBugReport() throws IOException { @@ -103,6 +139,12 @@ public class BaseSystem return log; } + @Override + public File getCSVOutputDir() + { + return getFilesDir("CSV"); + } + public String getLogcat() throws IOException { int maxLineCount = 250; diff --git a/app/src/main/java/org/isoron/uhabits/utils/SSLUtils.java b/uhabits-android/src/main/java/org/isoron/androidbase/CACertSSLContextProvider.java similarity index 83% rename from app/src/main/java/org/isoron/uhabits/utils/SSLUtils.java rename to uhabits-android/src/main/java/org/isoron/androidbase/CACertSSLContextProvider.java index 812e94dee..b69a10e9a 100644 --- a/app/src/main/java/org/isoron/uhabits/utils/SSLUtils.java +++ b/uhabits-android/src/main/java/org/isoron/androidbase/CACertSSLContextProvider.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. * @@ -17,10 +17,9 @@ * with this program. If not, see . */ -package org.isoron.uhabits.utils; +package org.isoron.androidbase; import android.content.*; -import android.support.annotation.*; import java.io.*; import java.security.*; @@ -29,14 +28,14 @@ import java.security.cert.*; import javax.net.ssl.*; -public abstract class SSLUtils +public interface CACertSSLContextProvider { - public static SSLContext getCACertSSLContext(@NonNull Context context) + default SSLContext getCACertSSLContext() { try { CertificateFactory cf = CertificateFactory.getInstance("X.509"); - InputStream caInput = context.getAssets().open("cacert.pem"); + InputStream caInput = getContext().getAssets().open("cacert.pem"); Certificate ca = cf.generateCertificate(caInput); KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); @@ -58,4 +57,5 @@ public abstract class SSLUtils } } + Context getContext(); } diff --git a/app/src/main/java/org/isoron/uhabits/activities/ActivityComponent.java b/uhabits-android/src/main/java/org/isoron/androidbase/activities/ActivityComponent.java similarity index 84% rename from app/src/main/java/org/isoron/uhabits/activities/ActivityComponent.java rename to uhabits-android/src/main/java/org/isoron/androidbase/activities/ActivityComponent.java index 918a70b4b..761d96926 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/ActivityComponent.java +++ b/uhabits-android/src/main/java/org/isoron/androidbase/activities/ActivityComponent.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. * @@ -17,16 +17,17 @@ * with this program. If not, see . */ -package org.isoron.uhabits.activities; +package org.isoron.androidbase.activities; import org.isoron.uhabits.*; import org.isoron.uhabits.activities.common.dialogs.*; +import org.isoron.uhabits.core.ui.*; import dagger.*; @ActivityScope @Component(modules = { ActivityModule.class }, - dependencies = { AppComponent.class }) + dependencies = { HabitsComponent.class }) public interface ActivityComponent { BaseActivity getActivity(); diff --git a/app/src/main/java/org/isoron/uhabits/activities/ActivityContext.java b/uhabits-android/src/main/java/org/isoron/androidbase/activities/ActivityContext.java similarity index 95% rename from app/src/main/java/org/isoron/uhabits/activities/ActivityContext.java rename to uhabits-android/src/main/java/org/isoron/androidbase/activities/ActivityContext.java index c75c28dae..5749c4ecc 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/ActivityContext.java +++ b/uhabits-android/src/main/java/org/isoron/androidbase/activities/ActivityContext.java @@ -17,7 +17,7 @@ * with this program. If not, see . */ -package org.isoron.uhabits.activities; +package org.isoron.androidbase.activities; import java.lang.annotation.*; diff --git a/app/src/main/java/org/isoron/uhabits/activities/ActivityModule.java b/uhabits-android/src/main/java/org/isoron/androidbase/activities/ActivityModule.java similarity index 82% rename from app/src/main/java/org/isoron/uhabits/activities/ActivityModule.java rename to uhabits-android/src/main/java/org/isoron/androidbase/activities/ActivityModule.java index dcf743241..adac8f2e5 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/ActivityModule.java +++ b/uhabits-android/src/main/java/org/isoron/androidbase/activities/ActivityModule.java @@ -17,10 +17,13 @@ * with this program. If not, see . */ -package org.isoron.uhabits.activities; +package org.isoron.androidbase.activities; import android.content.*; +import org.isoron.uhabits.activities.*; +import org.isoron.uhabits.core.ui.*; + import dagger.*; @Module @@ -45,4 +48,11 @@ public class ActivityModule { return activity; } + + @Provides + @ActivityScope + public static ThemeSwitcher getThemeSwitcher(AndroidThemeSwitcher t) + { + return t; + } } diff --git a/app/src/main/java/org/isoron/uhabits/activities/ActivityScope.java b/uhabits-android/src/main/java/org/isoron/androidbase/activities/ActivityScope.java similarity index 95% rename from app/src/main/java/org/isoron/uhabits/activities/ActivityScope.java rename to uhabits-android/src/main/java/org/isoron/androidbase/activities/ActivityScope.java index 3d02e80ae..82dad3ce9 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/ActivityScope.java +++ b/uhabits-android/src/main/java/org/isoron/androidbase/activities/ActivityScope.java @@ -17,7 +17,7 @@ * with this program. If not, see . */ -package org.isoron.uhabits.activities; +package org.isoron.androidbase.activities; import javax.inject.*; diff --git a/app/src/main/java/org/isoron/uhabits/activities/BaseActivity.java b/uhabits-android/src/main/java/org/isoron/androidbase/activities/BaseActivity.java similarity index 96% rename from app/src/main/java/org/isoron/uhabits/activities/BaseActivity.java rename to uhabits-android/src/main/java/org/isoron/androidbase/activities/BaseActivity.java index 2167311cb..f7d80efe1 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/BaseActivity.java +++ b/uhabits-android/src/main/java/org/isoron/androidbase/activities/BaseActivity.java @@ -17,7 +17,7 @@ * with this program. If not, see . */ -package org.isoron.uhabits.activities; +package org.isoron.androidbase.activities; import android.content.*; import android.os.*; @@ -26,6 +26,7 @@ import android.support.v7.app.*; import android.view.*; import org.isoron.uhabits.*; +import org.isoron.uhabits.activities.*; import static android.R.anim.fade_in; import static android.R.anim.fade_out; @@ -125,7 +126,7 @@ abstract public class BaseActivity extends AppCompatActivity component = DaggerActivityComponent .builder() .activityModule(new ActivityModule(this)) - .appComponent(app.getComponent()) + .habitsComponent(app.getComponent()) .build(); component.getThemeSwitcher().apply(); diff --git a/app/src/main/java/org/isoron/uhabits/activities/BaseExceptionHandler.java b/uhabits-android/src/main/java/org/isoron/androidbase/activities/BaseExceptionHandler.java similarity index 94% rename from app/src/main/java/org/isoron/uhabits/activities/BaseExceptionHandler.java rename to uhabits-android/src/main/java/org/isoron/androidbase/activities/BaseExceptionHandler.java index 5ea4638d9..d2df1f594 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/BaseExceptionHandler.java +++ b/uhabits-android/src/main/java/org/isoron/androidbase/activities/BaseExceptionHandler.java @@ -17,12 +17,13 @@ * with this program. If not, see . */ -package org.isoron.uhabits.activities; +package org.isoron.androidbase.activities; import android.support.annotation.*; +import org.isoron.androidbase.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.models.sqlite.*; public class BaseExceptionHandler implements Thread.UncaughtExceptionHandler diff --git a/app/src/main/java/org/isoron/uhabits/activities/BaseMenu.java b/uhabits-android/src/main/java/org/isoron/androidbase/activities/BaseMenu.java similarity index 95% rename from app/src/main/java/org/isoron/uhabits/activities/BaseMenu.java rename to uhabits-android/src/main/java/org/isoron/androidbase/activities/BaseMenu.java index 0a1e8026c..0dbaaac92 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/BaseMenu.java +++ b/uhabits-android/src/main/java/org/isoron/androidbase/activities/BaseMenu.java @@ -17,7 +17,7 @@ * with this program. If not, see . */ -package org.isoron.uhabits.activities; +package org.isoron.androidbase.activities; import android.support.annotation.*; import android.view.*; @@ -41,6 +41,12 @@ public abstract class BaseMenu this.activity = activity; } + @NonNull + public BaseActivity getActivity() + { + return activity; + } + /** * Declare that the menu has changed, and should be recreated. */ diff --git a/app/src/main/java/org/isoron/uhabits/activities/BaseRootView.java b/uhabits-android/src/main/java/org/isoron/androidbase/activities/BaseRootView.java similarity index 81% rename from app/src/main/java/org/isoron/uhabits/activities/BaseRootView.java rename to uhabits-android/src/main/java/org/isoron/androidbase/activities/BaseRootView.java index 93fbe562f..d86aafa00 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/BaseRootView.java +++ b/uhabits-android/src/main/java/org/isoron/androidbase/activities/BaseRootView.java @@ -17,7 +17,7 @@ * with this program. If not, see . */ -package org.isoron.uhabits.activities; +package org.isoron.androidbase.activities; import android.content.*; import android.support.annotation.*; @@ -27,6 +27,7 @@ import android.view.*; import android.widget.*; import org.isoron.uhabits.*; +import org.isoron.uhabits.core.ui.*; import org.isoron.uhabits.utils.*; import static android.os.Build.VERSION.*; @@ -47,6 +48,8 @@ public abstract class BaseRootView extends FrameLayout private final ThemeSwitcher themeSwitcher; + boolean shouldDisplayHomeAsUp = false; + public BaseRootView(@NonNull Context context) { super(context); @@ -57,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() { @@ -85,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/app/src/main/java/org/isoron/uhabits/activities/BaseScreen.java b/uhabits-android/src/main/java/org/isoron/androidbase/activities/BaseScreen.java similarity index 87% rename from app/src/main/java/org/isoron/uhabits/activities/BaseScreen.java rename to uhabits-android/src/main/java/org/isoron/androidbase/activities/BaseScreen.java index 302ec7db1..f1583cb81 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/BaseScreen.java +++ b/uhabits-android/src/main/java/org/isoron/androidbase/activities/BaseScreen.java @@ -17,15 +17,17 @@ * with this program. If not, see . */ -package org.isoron.uhabits.activities; +package org.isoron.androidbase.activities; import android.content.*; import android.graphics.*; import android.graphics.drawable.*; import android.net.*; import android.os.*; +import android.provider.*; import android.support.annotation.*; import android.support.design.widget.*; +import android.support.v4.app.*; import android.support.v4.content.res.*; import android.support.v7.app.*; import android.support.v7.view.ActionMode; @@ -34,10 +36,18 @@ import android.view.*; import android.widget.*; import org.isoron.uhabits.*; +import org.isoron.uhabits.notifications.*; import org.isoron.uhabits.utils.*; import java.io.*; +import static android.media.RingtoneManager.ACTION_RINGTONE_PICKER; +import static android.media.RingtoneManager.EXTRA_RINGTONE_DEFAULT_URI; +import static android.media.RingtoneManager.EXTRA_RINGTONE_EXISTING_URI; +import static android.media.RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT; +import static android.media.RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT; +import static android.media.RingtoneManager.EXTRA_RINGTONE_TYPE; +import static android.media.RingtoneManager.TYPE_NOTIFICATION; import static android.os.Build.VERSION.*; import static android.os.Build.VERSION_CODES.*; import static android.support.v4.content.FileProvider.*; @@ -117,6 +127,21 @@ public class BaseScreen } } + public static void showRingtonePicker(Fragment fragment, + int requestCode) + { + Uri existingRingtoneUri = RingtoneManager.getRingtoneUri(fragment.getContext()); + Uri defaultRingtoneUri = Settings.System.DEFAULT_NOTIFICATION_URI; + + Intent intent = new Intent(ACTION_RINGTONE_PICKER); + intent.putExtra(EXTRA_RINGTONE_TYPE, TYPE_NOTIFICATION); + intent.putExtra(EXTRA_RINGTONE_SHOW_DEFAULT, true); + intent.putExtra(EXTRA_RINGTONE_SHOW_SILENT, true); + intent.putExtra(EXTRA_RINGTONE_DEFAULT_URI, defaultRingtoneUri); + intent.putExtra(EXTRA_RINGTONE_EXISTING_URI, existingRingtoneUri); + fragment.startActivityForResult(intent, requestCode); + } + /** * Notifies the screen that its contents should be updated. */ diff --git a/app/src/main/java/org/isoron/uhabits/activities/BaseSelectionMenu.java b/uhabits-android/src/main/java/org/isoron/androidbase/activities/BaseSelectionMenu.java similarity index 98% rename from app/src/main/java/org/isoron/uhabits/activities/BaseSelectionMenu.java rename to uhabits-android/src/main/java/org/isoron/androidbase/activities/BaseSelectionMenu.java index 2b3c56d25..87396e216 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/BaseSelectionMenu.java +++ b/uhabits-android/src/main/java/org/isoron/androidbase/activities/BaseSelectionMenu.java @@ -17,7 +17,7 @@ * with this program. If not, see . */ -package org.isoron.uhabits.activities; +package org.isoron.androidbase.activities; import android.support.annotation.*; import android.support.v7.view.ActionMode; diff --git a/app/src/main/java/org/isoron/uhabits/utils/FileUtils.java b/uhabits-android/src/main/java/org/isoron/androidbase/utils/FileUtils.java similarity index 74% rename from app/src/main/java/org/isoron/uhabits/utils/FileUtils.java rename to uhabits-android/src/main/java/org/isoron/androidbase/utils/FileUtils.java index 4cee13ac3..59ca4a9b4 100644 --- a/app/src/main/java/org/isoron/uhabits/utils/FileUtils.java +++ b/uhabits-android/src/main/java/org/isoron/androidbase/utils/FileUtils.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. * @@ -17,16 +17,12 @@ * with this program. If not, see . */ -package org.isoron.uhabits.utils; +package org.isoron.androidbase.utils; -import android.content.*; import android.os.*; import android.support.annotation.*; -import android.support.v4.content.*; import android.util.*; -import org.isoron.uhabits.*; - import java.io.*; public abstract class FileUtils @@ -54,8 +50,8 @@ public abstract class FileUtils } @Nullable - private static File getDir(@NonNull File potentialParentDirs[], - @Nullable String relativePath) + public static File getDir(@NonNull File potentialParentDirs[], + @Nullable String relativePath) { if (relativePath == null) relativePath = ""; @@ -69,7 +65,7 @@ public abstract class FileUtils if (chosenDir == null) { - Log.e("DatabaseHelper", + Log.e("FileUtils", "getDir: all potential parents are null or non-writable"); return null; } @@ -78,7 +74,7 @@ public abstract class FileUtils String.format("%s/%s/", chosenDir.getAbsolutePath(), relativePath)); if (!dir.exists() && !dir.mkdirs()) { - Log.e("DatabaseHelper", + Log.e("FileUtils", "getDir: chosen dir does not exist and cannot be created"); return null; } @@ -86,22 +82,6 @@ public abstract class FileUtils return dir; } - @Nullable - public static File getFilesDir(@NonNull Context context, @Nullable String relativePath) - { - File externalFilesDirs[] = - ContextCompat.getExternalFilesDirs(context, null); - - if (externalFilesDirs == null) - { - Log.e("DatabaseHelper", - "getFilesDir: getExternalFilesDirs returned null"); - return null; - } - - return getDir(externalFilesDirs, relativePath); - } - @Nullable public static File getSDCardDir(@Nullable String relativePath) { diff --git a/app/src/main/java/org/isoron/uhabits/HabitLogger.java b/uhabits-android/src/main/java/org/isoron/uhabits/HabitLogger.java similarity index 92% rename from app/src/main/java/org/isoron/uhabits/HabitLogger.java rename to uhabits-android/src/main/java/org/isoron/uhabits/HabitLogger.java index fb781c273..81e6574cf 100644 --- a/app/src/main/java/org/isoron/uhabits/HabitLogger.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/HabitLogger.java @@ -22,8 +22,9 @@ package org.isoron.uhabits; import android.support.annotation.*; import android.util.*; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.utils.*; import java.text.*; import java.util.*; diff --git a/app/src/main/java/org/isoron/uhabits/HabitsApplication.java b/uhabits-android/src/main/java/org/isoron/uhabits/HabitsApplication.java similarity index 84% rename from app/src/main/java/org/isoron/uhabits/HabitsApplication.java rename to uhabits-android/src/main/java/org/isoron/uhabits/HabitsApplication.java index 8e2e1e8ad..91bfbd037 100644 --- a/app/src/main/java/org/isoron/uhabits/HabitsApplication.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/HabitsApplication.java @@ -24,10 +24,11 @@ import android.content.*; import com.activeandroid.*; +import org.isoron.androidbase.*; import org.isoron.uhabits.models.sqlite.*; import org.isoron.uhabits.notifications.*; +import org.isoron.uhabits.core.tasks.*; import org.isoron.uhabits.preferences.*; -import org.isoron.uhabits.tasks.*; import org.isoron.uhabits.utils.*; import org.isoron.uhabits.widgets.*; @@ -40,20 +41,20 @@ public class HabitsApplication extends Application { private Context context; - private static AppComponent component; + private static HabitsComponent component; private WidgetUpdater widgetUpdater; private ReminderScheduler reminderScheduler; - private NotificationTray notificationTray; + private AndroidNotificationTray notificationTray; - public AppComponent getComponent() + public HabitsComponent getComponent() { return component; } - public static void setComponent(AppComponent component) + public static void setComponent(HabitsComponent component) { HabitsApplication.component = component; } @@ -77,15 +78,15 @@ public class HabitsApplication extends Application super.onCreate(); context = this; - component = DaggerAppComponent + component = DaggerHabitsComponent .builder() .appModule(new AppModule(context)) .build(); if (isTestMode()) { - File db = DatabaseUtils.getDatabaseFile(context); - if (db.exists()) db.delete(); +// File db = DatabaseUtils.getDatabaseFile(context); +// if (db.exists()) db.delete(); } try @@ -105,10 +106,10 @@ public class HabitsApplication extends Application reminderScheduler = component.getReminderScheduler(); reminderScheduler.startListening(); - notificationTray = component.getNotificationTray(); + notificationTray = component.getAndroidNotificationTray(); notificationTray.startListening(); - Preferences prefs = component.getPreferences(); + AndroidPreferences prefs = component.getPreferences(); prefs.initialize(); prefs.updateLastAppVersion(); diff --git a/app/src/main/java/org/isoron/uhabits/HabitsBackupAgent.java b/uhabits-android/src/main/java/org/isoron/uhabits/HabitsBackupAgent.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/HabitsBackupAgent.java rename to uhabits-android/src/main/java/org/isoron/uhabits/HabitsBackupAgent.java diff --git a/app/src/main/java/org/isoron/uhabits/AppComponent.java b/uhabits-android/src/main/java/org/isoron/uhabits/HabitsComponent.java similarity index 72% rename from app/src/main/java/org/isoron/uhabits/AppComponent.java rename to uhabits-android/src/main/java/org/isoron/uhabits/HabitsComponent.java index 3dc205dd2..3e4af09b1 100644 --- a/app/src/main/java/org/isoron/uhabits/AppComponent.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/HabitsComponent.java @@ -21,15 +21,21 @@ package org.isoron.uhabits; import android.content.*; -import org.isoron.uhabits.activities.habits.list.model.*; -import org.isoron.uhabits.commands.*; +import org.isoron.androidbase.*; +import org.isoron.uhabits.core.*; +import org.isoron.uhabits.core.commands.*; import org.isoron.uhabits.intents.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.io.*; -import org.isoron.uhabits.models.*; import org.isoron.uhabits.models.sqlite.*; import org.isoron.uhabits.notifications.*; +import org.isoron.uhabits.core.preferences.*; import org.isoron.uhabits.preferences.*; import org.isoron.uhabits.sync.*; +import org.isoron.uhabits.core.tasks.*; +import org.isoron.uhabits.core.ui.*; +import org.isoron.uhabits.core.ui.screens.habits.list.*; +import org.isoron.uhabits.core.utils.*; import org.isoron.uhabits.tasks.*; import org.isoron.uhabits.utils.*; import org.isoron.uhabits.widgets.*; @@ -38,15 +44,22 @@ import dagger.*; @AppScope @Component(modules = { - AppModule.class, AndroidTaskRunner.class, SQLModelFactory.class + AppModule.class, + HabitsModule.class, + AndroidTaskRunner.class, + SQLModelFactory.class }) -public interface AppComponent +public interface HabitsComponent { + BaseSystem getBaseSystem(); + CommandRunner getCommandRunner(); @AppContext Context getContext(); + Preferences getCorePreferences(); + CreateHabitCommandFactory getCreateHabitCommandFactory(); EditHabitCommandFactory getEditHabitCommandFactory(); @@ -63,16 +76,22 @@ public interface AppComponent IntentParser getIntentParser(); + MidnightTimer getMidnightTimer(); + ModelFactory getModelFactory(); NotificationTray getNotificationTray(); PendingIntentFactory getPendingIntentFactory(); - Preferences getPreferences(); + AndroidPreferences getPreferences(); + + AndroidNotificationTray getAndroidNotificationTray(); ReminderScheduler getReminderScheduler(); + RingtoneManager getRingtoneManager(); + SyncManager getSyncManager(); TaskRunner getTaskRunner(); diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitModule.java b/uhabits-android/src/main/java/org/isoron/uhabits/HabitsModule.java similarity index 58% rename from app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitModule.java rename to uhabits-android/src/main/java/org/isoron/uhabits/HabitsModule.java index bf4cbee25..db1a0cdcf 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitModule.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/HabitsModule.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. * @@ -17,27 +17,32 @@ * with this program. If not, see . */ -package org.isoron.uhabits.activities.habits.show; +package org.isoron.uhabits; -import org.isoron.uhabits.activities.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.*; +import org.isoron.uhabits.notifications.*; +import org.isoron.uhabits.core.preferences.*; +import org.isoron.uhabits.core.ui.*; +import org.isoron.uhabits.preferences.*; import dagger.*; @Module -public class ShowHabitModule extends ActivityModule +public class HabitsModule { - private final Habit habit; - - public ShowHabitModule(BaseActivity activity, Habit habit) + @Provides + @AppScope + public static Preferences getPreferences(AndroidPreferences preferences) { - super(activity); - this.habit = habit; + return preferences; } + @Provides - public Habit getHabit() + @AppScope + public static NotificationTray getTray(AndroidNotificationTray tray) { - return habit; + return tray; } } + diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/AndroidThemeSwitcher.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/AndroidThemeSwitcher.java new file mode 100644 index 000000000..295182d02 --- /dev/null +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/AndroidThemeSwitcher.java @@ -0,0 +1,63 @@ +/* + * 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.activities; + +import android.support.annotation.*; + +import org.isoron.androidbase.activities.*; +import org.isoron.uhabits.*; +import org.isoron.uhabits.core.preferences.*; +import org.isoron.uhabits.core.ui.*; + +import javax.inject.*; + +@ActivityScope +public class AndroidThemeSwitcher extends ThemeSwitcher +{ + @NonNull + private final BaseActivity activity; + + @Inject + public AndroidThemeSwitcher(@NonNull BaseActivity activity, + @NonNull Preferences preferences) + { + super(preferences); + this.activity = activity; + } + + @Override + public void applyDarkTheme() + { + activity.setTheme(R.style.AppBaseThemeDark); + } + + @Override + public void applyLightTheme() + { + activity.setTheme(R.style.AppBaseTheme); + } + + @Override + public void applyPureBlackTheme() + { + activity.setTheme(R.style.AppBaseThemeDark_PureBlack); + + } +} diff --git a/app/src/main/java/org/isoron/uhabits/activities/about/AboutActivity.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutActivity.java similarity index 72% rename from app/src/main/java/org/isoron/uhabits/activities/about/AboutActivity.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutActivity.java index b887766a5..b99bd15ed 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/about/AboutActivity.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutActivity.java @@ -21,8 +21,9 @@ package org.isoron.uhabits.activities.about; import android.os.*; -import org.isoron.uhabits.activities.*; -import org.isoron.uhabits.intents.*; +import org.isoron.androidbase.activities.*; +import org.isoron.uhabits.*; +import org.isoron.uhabits.core.ui.screens.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(); + HabitsComponent 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/app/src/main/java/org/isoron/uhabits/activities/about/AboutRootView.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutRootView.java similarity index 51% rename from app/src/main/java/org/isoron/uhabits/activities/about/AboutRootView.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutRootView.java index e4d18bbd6..db7583b2e 100644 --- a/app/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.activities.*; -import org.isoron.uhabits.intents.*; -import org.isoron.uhabits.preferences.*; +import org.isoron.uhabits.core.ui.screens.about.*; import org.isoron.uhabits.utils.*; import butterknife.*; @@ -39,56 +36,22 @@ public class AboutRootView extends BaseRootView @BindView(R.id.tvVersion) TextView tvVersion; - @BindView(R.id.tvRate) - TextView tvRate; - - @BindView(R.id.tvFeedback) - TextView tvFeedback; - - @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)); - - if (context.getApplicationContext() instanceof HabitsApplication) - { - HabitsApplication app = - (HabitsApplication) context.getApplicationContext(); - prefs = app.getComponent().getPreferences(); - } - } - - @Override - public boolean getDisplayHomeAsUp() - { - return true; - } + String version = getResources().getString(R.string.version_n); + tvVersion.setText(String.format(version, BuildConfig.VERSION_NAME)); - @NonNull - @Override - public Toolbar getToolbar() - { - return toolbar; + setDisplayHomeAsUp(true); } @Override @@ -104,48 +67,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..c8c5808c4 --- /dev/null +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/AboutScreen.java @@ -0,0 +1,77 @@ +/* + * 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.core.ui.screens.about.*; +import org.isoron.uhabits.intents.*; + +import javax.inject.*; + +import static org.isoron.uhabits.core.ui.screens.about.AboutBehavior.Message.*; + +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) + { + if (message == YOU_ARE_NOW_A_DEVELOPER) Toast + .makeText(activity, "You are now a developer", 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/app/src/main/java/org/isoron/uhabits/activities/about/package-info.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/about/package-info.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/activities/about/package-info.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/about/package-info.java diff --git a/app/src/main/java/org/isoron/uhabits/activities/common/dialogs/ColorPickerDialog.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/ColorPickerDialog.java similarity index 81% rename from app/src/main/java/org/isoron/uhabits/activities/common/dialogs/ColorPickerDialog.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/ColorPickerDialog.java index c4ab3022c..8e58acded 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/common/dialogs/ColorPickerDialog.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/ColorPickerDialog.java @@ -19,6 +19,7 @@ package org.isoron.uhabits.activities.common.dialogs; +import org.isoron.uhabits.core.ui.callbacks.*; import org.isoron.uhabits.utils.*; /** @@ -26,16 +27,12 @@ import org.isoron.uhabits.utils.*; */ public class ColorPickerDialog extends com.android.colorpicker.ColorPickerDialog { - public void setListener(OnColorSelectedListener listener) + public void setListener(OnColorPickedCallback callback) { - super.setOnColorSelectedListener(c -> { + super.setOnColorSelectedListener(c -> + { c = ColorUtils.colorToPaletteIndex(getContext(), c); - listener.onColorSelected(c); + callback.onColorPicked(c); }); } - - public interface OnColorSelectedListener - { - void onColorSelected(int color); - } } diff --git a/app/src/main/java/org/isoron/uhabits/activities/common/dialogs/ColorPickerDialogFactory.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/ColorPickerDialogFactory.java similarity index 97% rename from app/src/main/java/org/isoron/uhabits/activities/common/dialogs/ColorPickerDialogFactory.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/ColorPickerDialogFactory.java index e13368916..f959bee62 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/common/dialogs/ColorPickerDialogFactory.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/ColorPickerDialogFactory.java @@ -21,8 +21,8 @@ package org.isoron.uhabits.activities.common.dialogs; import android.content.*; +import org.isoron.androidbase.activities.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.activities.*; import org.isoron.uhabits.utils.*; import javax.inject.*; diff --git a/app/src/main/java/org/isoron/uhabits/activities/common/dialogs/ConfirmDeleteDialog.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/ConfirmDeleteDialog.java similarity index 88% rename from app/src/main/java/org/isoron/uhabits/activities/common/dialogs/ConfirmDeleteDialog.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/ConfirmDeleteDialog.java index cf5ef4b89..445cfb8d0 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/common/dialogs/ConfirmDeleteDialog.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/ConfirmDeleteDialog.java @@ -20,12 +20,14 @@ package org.isoron.uhabits.activities.common.dialogs; import android.content.*; +import android.support.annotation.*; import android.support.v7.app.*; import com.google.auto.factory.*; +import org.isoron.androidbase.activities.*; import org.isoron.uhabits.R; -import org.isoron.uhabits.activities.*; +import org.isoron.uhabits.core.ui.callbacks.*; import butterknife.*; @@ -45,19 +47,14 @@ public class ConfirmDeleteDialog extends AlertDialog protected String no; protected ConfirmDeleteDialog(@Provided @ActivityContext Context context, - Callback callback) + @NonNull OnConfirmedCallback callback) { super(context); ButterKnife.bind(this); setTitle(R.string.delete_habits); setMessage(question); - setButton(BUTTON_POSITIVE, yes, (dialog, which) -> callback.run()); + setButton(BUTTON_POSITIVE, yes, (dialog, which) -> callback.onConfirmed()); setButton(BUTTON_NEGATIVE, no, (dialog, which) -> {}); } - - public interface Callback - { - void run(); - } } diff --git a/app/src/main/java/org/isoron/uhabits/activities/common/dialogs/HistoryEditorDialog.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/HistoryEditorDialog.java similarity index 98% rename from app/src/main/java/org/isoron/uhabits/activities/common/dialogs/HistoryEditorDialog.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/HistoryEditorDialog.java index 53b079b47..19d4afb86 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/common/dialogs/HistoryEditorDialog.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/HistoryEditorDialog.java @@ -29,8 +29,8 @@ import android.util.*; import org.isoron.uhabits.*; import org.isoron.uhabits.activities.common.views.*; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.tasks.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.tasks.*; import org.isoron.uhabits.utils.*; import static org.isoron.uhabits.utils.InterfaceUtils.*; diff --git a/app/src/main/java/org/isoron/uhabits/activities/common/dialogs/WeekdayPickerDialog.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/WeekdayPickerDialog.java similarity index 97% rename from app/src/main/java/org/isoron/uhabits/activities/common/dialogs/WeekdayPickerDialog.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/WeekdayPickerDialog.java index 08b754df7..91f2012b9 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/common/dialogs/WeekdayPickerDialog.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/dialogs/WeekdayPickerDialog.java @@ -26,8 +26,8 @@ import android.support.v7.app.AlertDialog; import android.support.v7.app.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.utils.*; /** * Dialog that allows the user to pick one or more days of the week. diff --git a/app/src/main/java/org/isoron/uhabits/activities/common/views/BarChart.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/BarChart.java similarity index 98% rename from app/src/main/java/org/isoron/uhabits/activities/common/views/BarChart.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/BarChart.java index 42271a838..fe5bbae42 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/common/views/BarChart.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/BarChart.java @@ -26,7 +26,8 @@ import android.util.*; import org.isoron.uhabits.*; import org.isoron.uhabits.activities.habits.list.views.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.utils.*; import org.isoron.uhabits.utils.*; import java.text.*; @@ -445,9 +446,9 @@ public class BarChart extends ScrollableChart return; } - dfYear = DateFormats.fromSkeleton("yyyy"); - dfMonth = DateFormats.fromSkeleton("MMM"); - dfDay = DateFormats.fromSkeleton("d"); + dfYear = AndroidDateFormats.fromSkeleton("yyyy"); + dfMonth = AndroidDateFormats.fromSkeleton("MMM"); + dfDay = AndroidDateFormats.fromSkeleton("d"); } private void initPaints() diff --git a/app/src/main/java/org/isoron/uhabits/activities/common/views/BundleSavedState.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/BundleSavedState.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/activities/common/views/BundleSavedState.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/BundleSavedState.java diff --git a/app/src/main/java/org/isoron/uhabits/activities/common/views/FrequencyChart.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/FrequencyChart.java similarity index 98% rename from app/src/main/java/org/isoron/uhabits/activities/common/views/FrequencyChart.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/FrequencyChart.java index fa1d38214..9f6400eeb 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/common/views/FrequencyChart.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/FrequencyChart.java @@ -25,6 +25,7 @@ import android.support.annotation.*; import android.util.*; import org.isoron.uhabits.*; +import org.isoron.uhabits.core.utils.*; import org.isoron.uhabits.utils.*; import java.text.*; @@ -299,8 +300,8 @@ public class FrequencyChart extends ScrollableChart private void initDateFormats() { - dfMonth = DateFormats.fromSkeleton("MMM"); - dfYear = DateFormats.fromSkeleton("yyyy"); + dfMonth = AndroidDateFormats.fromSkeleton("MMM"); + dfYear = AndroidDateFormats.fromSkeleton("yyyy"); } private void initRects() diff --git a/app/src/main/java/org/isoron/uhabits/activities/common/views/HabitChart.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/HabitChart.java similarity index 95% rename from app/src/main/java/org/isoron/uhabits/activities/common/views/HabitChart.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/HabitChart.java index cd74cf15c..c10a1f466 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/common/views/HabitChart.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/HabitChart.java @@ -19,7 +19,7 @@ package org.isoron.uhabits.activities.common.views; -import org.isoron.uhabits.models.Habit; +import org.isoron.uhabits.core.models.Habit; public interface HabitChart { diff --git a/app/src/main/java/org/isoron/uhabits/activities/common/views/HistoryChart.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/HistoryChart.java similarity index 98% rename from app/src/main/java/org/isoron/uhabits/activities/common/views/HistoryChart.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/HistoryChart.java index 1f6135876..a76c8d208 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/common/views/HistoryChart.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/HistoryChart.java @@ -27,12 +27,13 @@ import android.util.*; import android.view.*; import org.isoron.uhabits.*; +import org.isoron.uhabits.core.utils.*; import org.isoron.uhabits.utils.*; import java.text.*; import java.util.*; -import static org.isoron.uhabits.models.Checkmark.*; +import static org.isoron.uhabits.core.models.Checkmark.*; import static org.isoron.uhabits.utils.InterfaceUtils.*; public class HistoryChart extends ScrollableChart @@ -413,8 +414,8 @@ public class HistoryChart extends ScrollableChart private void initDateFormats() { - dfMonth = DateFormats.fromSkeleton("MMM"); - dfYear = DateFormats.fromSkeleton("yyyy"); + dfMonth = AndroidDateFormats.fromSkeleton("MMM"); + dfYear = AndroidDateFormats.fromSkeleton("yyyy"); } private void initRects() diff --git a/app/src/main/java/org/isoron/uhabits/activities/common/views/RingView.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/RingView.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/activities/common/views/RingView.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/RingView.java diff --git a/app/src/main/java/org/isoron/uhabits/activities/common/views/ScoreChart.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/ScoreChart.java similarity index 97% rename from app/src/main/java/org/isoron/uhabits/activities/common/views/ScoreChart.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/ScoreChart.java index 14b77ee77..f2d540517 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/common/views/ScoreChart.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/ScoreChart.java @@ -25,7 +25,8 @@ import android.support.annotation.*; import android.util.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.utils.*; import org.isoron.uhabits.utils.*; import java.text.*; @@ -410,9 +411,9 @@ public class ScoreChart extends ScrollableChart private void initDateFormats() { - dfYear = DateFormats.fromSkeleton("yyyy"); - dfMonth = DateFormats.fromSkeleton("MMM"); - dfDay = DateFormats.fromSkeleton("d"); + dfYear = AndroidDateFormats.fromSkeleton("yyyy"); + dfMonth = AndroidDateFormats.fromSkeleton("MMM"); + dfDay = AndroidDateFormats.fromSkeleton("d"); } private void initPaints() diff --git a/app/src/main/java/org/isoron/uhabits/activities/common/views/ScrollableChart.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/ScrollableChart.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/activities/common/views/ScrollableChart.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/ScrollableChart.java diff --git a/app/src/main/java/org/isoron/uhabits/activities/common/views/StreakChart.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/StreakChart.java similarity index 99% rename from app/src/main/java/org/isoron/uhabits/activities/common/views/StreakChart.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/StreakChart.java index e5eae8da9..361828c05 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/common/views/StreakChart.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/StreakChart.java @@ -26,7 +26,8 @@ import android.view.*; import android.view.ViewGroup.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.utils.*; import org.isoron.uhabits.utils.*; import java.text.*; diff --git a/app/src/main/java/org/isoron/uhabits/activities/common/views/package-info.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/package-info.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/activities/common/views/package-info.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/common/views/package-info.java diff --git a/app/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 similarity index 96% rename from app/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialog.java index f8c425be6..5eb74bf2d 100644 --- a/app/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 @@ -28,19 +28,19 @@ import android.view.*; import com.android.datetimepicker.time.*; +import org.isoron.androidbase.activities.*; import org.isoron.uhabits.*; import org.isoron.uhabits.R; -import org.isoron.uhabits.activities.*; import org.isoron.uhabits.activities.common.dialogs.*; import org.isoron.uhabits.activities.habits.edit.views.*; -import org.isoron.uhabits.commands.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.commands.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.preferences.*; import butterknife.*; import static android.view.View.*; -import static org.isoron.uhabits.activities.ThemeSwitcher.THEME_LIGHT; +import static org.isoron.uhabits.core.ui.ThemeSwitcher.THEME_LIGHT; public class EditHabitDialog extends AppCompatDialogFragment { @@ -50,13 +50,13 @@ public class EditHabitDialog extends AppCompatDialogFragment protected Habit originalHabit; - protected Preferences prefs; + protected AndroidPreferences prefs; protected CommandRunner commandRunner; protected HabitList habitList; - protected AppComponent component; + protected HabitsComponent component; protected ModelFactory modelFactory; @@ -77,7 +77,7 @@ public class EditHabitDialog extends AppCompatDialogFragment @Override public int getTheme() { - AppComponent component = + HabitsComponent component = ((HabitsApplication) getContext().getApplicationContext()).getComponent(); if(component.getPreferences().getTheme() == THEME_LIGHT) diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialogFactory.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialogFactory.java similarity index 98% rename from app/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialogFactory.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialogFactory.java index 7ca3ef391..a91c3b14a 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialogFactory.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/EditHabitDialogFactory.java @@ -22,7 +22,7 @@ package org.isoron.uhabits.activities.habits.edit; import android.os.*; import android.support.annotation.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import javax.inject.*; diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/edit/package-info.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/package-info.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/activities/habits/edit/package-info.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/package-info.java diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/edit/views/ExampleEditText.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/ExampleEditText.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/activities/habits/edit/views/ExampleEditText.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/ExampleEditText.java diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/edit/views/FrequencyPanel.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/FrequencyPanel.java similarity index 99% rename from app/src/main/java/org/isoron/uhabits/activities/habits/edit/views/FrequencyPanel.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/FrequencyPanel.java index cb4f86d56..aac5d47e7 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/edit/views/FrequencyPanel.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/FrequencyPanel.java @@ -28,7 +28,7 @@ import android.view.*; import android.widget.*; import org.isoron.uhabits.R; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import butterknife.*; diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/edit/views/NameDescriptionPanel.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/NameDescriptionPanel.java similarity index 98% rename from app/src/main/java/org/isoron/uhabits/activities/habits/edit/views/NameDescriptionPanel.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/NameDescriptionPanel.java index 5c07aab0f..6d2ac6848 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/edit/views/NameDescriptionPanel.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/NameDescriptionPanel.java @@ -29,7 +29,7 @@ import android.widget.*; import org.isoron.uhabits.R; import org.isoron.uhabits.activities.common.views.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.utils.*; import butterknife.*; diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/edit/views/ReminderPanel.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/ReminderPanel.java similarity index 95% rename from app/src/main/java/org/isoron/uhabits/activities/habits/edit/views/ReminderPanel.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/ReminderPanel.java index 7f1fc7499..6d2c399e7 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/edit/views/ReminderPanel.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/ReminderPanel.java @@ -31,12 +31,11 @@ import com.android.datetimepicker.time.*; import org.isoron.uhabits.R; import org.isoron.uhabits.activities.common.dialogs.*; import org.isoron.uhabits.activities.common.views.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.utils.*; import butterknife.*; -import static org.isoron.uhabits.utils.DateUtils.*; - public class ReminderPanel extends FrameLayout implements TimePickerDialog.OnTimeSetListener, WeekdayPickerDialog.OnWeekdaysPickedListener @@ -86,12 +85,12 @@ public class ReminderPanel extends FrameLayout } Context ctx = getContext(); - String time = formatTime(ctx, reminder.getHour(), reminder.getMinute()); + String time = AndroidDateUtils.formatTime(ctx, reminder.getHour(), reminder.getMinute()); tvReminderTime.setText(time); llReminderDays.setVisibility(View.VISIBLE); boolean weekdays[] = reminder.getDays().toArray(); - tvReminderDays.setText(formatWeekdayList(ctx, weekdays)); + tvReminderDays.setText(AndroidDateUtils.formatWeekdayList(ctx, weekdays)); } @Override diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/edit/views/TargetPanel.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/TargetPanel.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/activities/habits/edit/views/TargetPanel.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/edit/views/TargetPanel.java diff --git a/app/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 similarity index 88% rename from app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.java index ff8e50d8a..6644fca1c 100644 --- a/app/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 @@ -22,12 +22,13 @@ package org.isoron.uhabits.activities.habits.list; import android.content.*; import android.os.*; +import org.isoron.androidbase.activities.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.activities.*; import org.isoron.uhabits.activities.habits.list.model.*; import org.isoron.uhabits.preferences.*; import org.isoron.uhabits.sync.*; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.ui.*; +import org.isoron.uhabits.core.utils.*; /** * Activity that allows the user to see and modify the list of habits. @@ -44,7 +45,7 @@ public class ListHabitsActivity extends BaseActivity private boolean pureBlack; - private Preferences prefs; + private AndroidPreferences prefs; private MidnightTimer midnightTimer; @@ -59,11 +60,12 @@ public class ListHabitsActivity extends BaseActivity super.onCreate(savedInstanceState); HabitsApplication app = (HabitsApplication) getApplicationContext(); + midnightTimer = app.getComponent().getMidnightTimer(); component = DaggerListHabitsComponent .builder() - .appComponent(app.getComponent()) - .activityModule(new ActivityModule(this)) + .habitsComponent(app.getComponent()) + .listHabitsModule(new ListHabitsModule(this)) .build(); ListHabitsMenu menu = component.getMenu(); @@ -79,11 +81,10 @@ public class ListHabitsActivity extends BaseActivity screen.setMenu(menu); screen.setController(controller); + screen.setListController(component.getListController()); screen.setSelectionMenu(selectionMenu); rootView.setController(controller, selectionMenu); - midnightTimer = component.getMidnightTimer(); - if(prefs.isSyncFeatureEnabled()) startService(new Intent(this, SyncService.class)); diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsComponent.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsComponent.java similarity index 87% rename from app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsComponent.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsComponent.java index 4f8161d40..39dd1f60a 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsComponent.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsComponent.java @@ -19,17 +19,16 @@ package org.isoron.uhabits.activities.habits.list; +import org.isoron.androidbase.activities.*; import org.isoron.uhabits.*; -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.utils.*; import dagger.*; @ActivityScope -@Component(modules = { ActivityModule.class }, - dependencies = { AppComponent.class }) +@Component(modules = { ListHabitsModule.class }, + dependencies = { HabitsComponent.class }) public interface ListHabitsComponent { HabitCardListAdapter getAdapter(); @@ -38,9 +37,9 @@ public interface ListHabitsComponent ListHabitsController getController(); - ListHabitsMenu getMenu(); + HabitCardListController getListController(); - MidnightTimer getMidnightTimer(); + ListHabitsMenu getMenu(); NumberButtonControllerFactory getNumberButtonControllerFactory(); diff --git a/app/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 similarity index 54% rename from app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsController.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsController.java index efd734938..a9e49208f 100644 --- a/app/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 @@ -21,19 +21,16 @@ package org.isoron.uhabits.activities.habits.list; import android.support.annotation.*; +import org.isoron.androidbase.activities.*; import org.isoron.uhabits.*; -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.preferences.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.tasks.*; +import org.isoron.uhabits.core.ui.screens.habits.list.*; import org.isoron.uhabits.tasks.*; -import org.isoron.uhabits.utils.*; -import org.isoron.uhabits.widgets.*; import java.io.*; -import java.util.*; import javax.inject.*; @@ -41,80 +38,53 @@ import javax.inject.*; public class ListHabitsController implements HabitCardListController.HabitListener { - @NonNull - private final ListHabitsScreen screen; + private final ListHabitsBehavior behavior; @NonNull - private final BaseSystem system; - - @NonNull - private final HabitList habitList; + private final ListHabitsScreen screen; @NonNull private final HabitCardListAdapter adapter; - @NonNull - private final Preferences prefs; - - @NonNull - private final CommandRunner commandRunner; - @NonNull private final TaskRunner taskRunner; - private ReminderScheduler reminderScheduler; - - private WidgetUpdater widgetUpdater; - private ImportDataTaskFactory importTaskFactory; - private ExportCSVTaskFactory exportCSVFactory; - private ExportDBTaskFactory exportDBFactory; @Inject - public ListHabitsController(@NonNull BaseSystem system, - @NonNull CommandRunner commandRunner, - @NonNull HabitList habitList, + public ListHabitsController(@NonNull ListHabitsBehavior behavior, @NonNull HabitCardListAdapter adapter, @NonNull ListHabitsScreen screen, - @NonNull Preferences prefs, - @NonNull ReminderScheduler reminderScheduler, @NonNull TaskRunner taskRunner, - @NonNull WidgetUpdater widgetUpdater, @NonNull ImportDataTaskFactory importTaskFactory, - @NonNull ExportCSVTaskFactory exportCSVFactory, @NonNull ExportDBTaskFactory exportDBFactory) { + this.behavior = behavior; this.adapter = adapter; - this.commandRunner = commandRunner; - this.habitList = habitList; - this.prefs = prefs; this.screen = screen; - this.system = system; this.taskRunner = taskRunner; - this.reminderScheduler = reminderScheduler; - this.widgetUpdater = widgetUpdater; this.importTaskFactory = importTaskFactory; - this.exportCSVFactory = exportCSVFactory; this.exportDBFactory = exportDBFactory; } - public void onExportCSV() + @Override + public void onEdit(@NonNull Habit habit, long timestamp) { - List selected = new LinkedList<>(); - for (Habit h : habitList) selected.add(h); + behavior.onEdit(habit, timestamp); + } - taskRunner.execute(exportCSVFactory.create(selected, filename -> { - if (filename != null) screen.showSendFileScreen(filename); - else screen.showMessage(R.string.could_not_export); - })); + public void onExportCSV() + { + behavior.onExportCSV(); } public void onExportDB() { - taskRunner.execute(exportDBFactory.create(filename -> { + taskRunner.execute(exportDBFactory.create(filename -> + { if (filename != null) screen.showSendFileScreen(filename); else screen.showMessage(R.string.could_not_export); })); @@ -123,19 +93,20 @@ public class ListHabitsController @Override public void onHabitClick(@NonNull Habit h) { - screen.showHabitScreen(h); + behavior.onClickHabit(h); } @Override public void onHabitReorder(@NonNull Habit from, @NonNull Habit to) { - taskRunner.execute(() -> habitList.reorder(from, to)); + behavior.onReorderHabit(from, to); } public void onImportData(@NonNull File file, @NonNull OnFinishedListener finishedListener) { - taskRunner.execute(importTaskFactory.create(file, result -> { + taskRunner.execute(importTaskFactory.create(file, result -> + { switch (result) { case ImportDataTask.SUCCESS: @@ -162,21 +133,6 @@ public class ListHabitsController screen.showMessage(R.string.long_press_to_edit); } - @Override - public void onEdit(@NonNull Habit habit, long timestamp) - { - CheckmarkList checkmarks = habit.getCheckmarks(); - double oldValue = checkmarks.getValues(timestamp, timestamp)[0]; - - screen.showNumberPicker(oldValue / 1000, habit.getUnit(), newValue -> { - newValue = Math.round(newValue * 1000); - commandRunner.execute( - new CreateRepetitionCommand(habit, timestamp, (int) newValue), - habit.getId()); - }); - } - - @Override public void onInvalidToggle() { @@ -185,55 +141,23 @@ public class ListHabitsController public void onRepairDB() { - taskRunner.execute(() -> { - habitList.repair(); - screen.showMessage(R.string.database_repaired); - }); + behavior.onRepairDB(); } public void onSendBugReport() { - try - { - system.dumpBugReportToFile(); - } - catch (IOException e) - { - // ignored - } - - try - { - String log = system.getBugReport(); - int to = R.string.bugReportTo; - int subject = R.string.bugReportSubject; - screen.showSendEmailScreen(to, subject, log); - } - catch (IOException e) - { - e.printStackTrace(); - screen.showMessage(R.string.bug_report_failed); - } + behavior.onSendBugReport(); } public void onStartup() { - prefs.incrementLaunchCount(); - if (prefs.isFirstRun()) onFirstRun(); + behavior.onStartup(); } @Override public void onToggle(@NonNull Habit habit, long timestamp) { - commandRunner.execute(new ToggleRepetitionCommand(habit, timestamp), - habit.getId()); - } - - private void onFirstRun() - { - prefs.setFirstRun(false); - prefs.updateLastHint(-1, DateUtils.getStartOfToday()); - screen.showIntroScreen(); + behavior.onToggle(habit, timestamp); } public interface OnFinishedListener diff --git a/app/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 similarity index 59% rename from app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.java index aa3826c4c..8eabf2192 100644 --- a/app/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 @@ -22,25 +22,20 @@ package org.isoron.uhabits.activities.habits.list; import android.support.annotation.*; import android.view.*; +import org.isoron.androidbase.activities.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.activities.*; -import org.isoron.uhabits.activities.habits.list.model.*; -import org.isoron.uhabits.preferences.*; +import org.isoron.uhabits.core.preferences.*; +import org.isoron.uhabits.core.ui.*; +import org.isoron.uhabits.core.ui.screens.habits.list.*; import javax.inject.*; @ActivityScope public class ListHabitsMenu extends BaseMenu { - @NonNull - private final ListHabitsScreen screen; - - private final HabitCardListAdapter adapter; - - private boolean showArchived; - private boolean showCompleted; + @NonNull + private final ListHabitsMenuBehavior behavior; private final Preferences preferences; @@ -48,33 +43,25 @@ public class ListHabitsMenu extends BaseMenu @Inject public ListHabitsMenu(@NonNull BaseActivity activity, - @NonNull ListHabitsScreen screen, - @NonNull HabitCardListAdapter adapter, @NonNull Preferences preferences, - @NonNull ThemeSwitcher themeSwitcher) + @NonNull ThemeSwitcher themeSwitcher, + @NonNull ListHabitsMenuBehavior behavior) { super(activity); - this.screen = screen; - this.adapter = adapter; this.preferences = preferences; this.themeSwitcher = themeSwitcher; - - showCompleted = preferences.getShowCompleted(); - showArchived = preferences.getShowArchived(); - updateAdapterFilter(); + this.behavior = behavior; } @Override public void onCreate(@NonNull Menu menu) { MenuItem nightModeItem = menu.findItem(R.id.actionToggleNightMode); - nightModeItem.setChecked(themeSwitcher.isNightMode()); - MenuItem hideArchivedItem = menu.findItem(R.id.actionHideArchived); - hideArchivedItem.setChecked(!showArchived); - MenuItem hideCompletedItem = menu.findItem(R.id.actionHideCompleted); - hideCompletedItem.setChecked(!showCompleted); + nightModeItem.setChecked(themeSwitcher.isNightMode()); + hideArchivedItem.setChecked(!preferences.getShowArchived()); + hideCompletedItem.setChecked(!preferences.getShowCompleted()); } @Override @@ -83,49 +70,49 @@ public class ListHabitsMenu extends BaseMenu switch (item.getItemId()) { case R.id.actionToggleNightMode: - screen.toggleNightMode(); + behavior.onToggleNightMode(); return true; case R.id.actionAdd: - screen.showCreateHabitScreen(); + behavior.onCreateHabit(); return true; case R.id.actionFAQ: - screen.showFAQScreen(); + behavior.onViewFAQ(); return true; case R.id.actionAbout: - screen.showAboutScreen(); + behavior.onViewAbout(); return true; case R.id.actionSettings: - screen.showSettingsScreen(); + behavior.onViewSettings(); return true; case R.id.actionHideArchived: - toggleShowArchived(); + behavior.onToggleShowArchived(); invalidate(); return true; case R.id.actionHideCompleted: - toggleShowCompleted(); + behavior.onToggleShowCompleted(); invalidate(); return true; case R.id.actionSortColor: - adapter.setOrder(HabitList.Order.BY_COLOR); + behavior.onSortByColor(); return true; case R.id.actionSortManual: - adapter.setOrder(HabitList.Order.BY_POSITION); + behavior.onSortByManually(); return true; case R.id.actionSortName: - adapter.setOrder(HabitList.Order.BY_NAME); + behavior.onSortByName(); return true; case R.id.actionSortScore: - adapter.setOrder(HabitList.Order.BY_SCORE); + behavior.onSortByScore(); return true; default: @@ -139,26 +126,4 @@ public class ListHabitsMenu extends BaseMenu return R.menu.list_habits; } - private void toggleShowArchived() - { - showArchived = !showArchived; - preferences.setShowArchived(showArchived); - updateAdapterFilter(); - } - - private void toggleShowCompleted() - { - showCompleted = !showCompleted; - preferences.setShowCompleted(showCompleted); - updateAdapterFilter(); - } - - private void updateAdapterFilter() - { - adapter.setFilter(new HabitMatcherBuilder() - .setArchivedAllowed(showArchived) - .setCompletedAllowed(showCompleted) - .build()); - adapter.refresh(); - } } diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsModule.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsModule.java new file mode 100644 index 000000000..275e4850e --- /dev/null +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsModule.java @@ -0,0 +1,74 @@ +/* + * 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.list; + + +import org.isoron.androidbase.*; +import org.isoron.androidbase.activities.*; +import org.isoron.uhabits.activities.habits.list.model.*; +import org.isoron.uhabits.core.ui.screens.habits.list.*; + +import dagger.*; + +@Module +public class ListHabitsModule extends ActivityModule +{ + public ListHabitsModule(BaseActivity activity) + { + super(activity); + } + + @Provides + ListHabitsMenuBehavior.Adapter getAdapter(HabitCardListAdapter adapter) + { + return adapter; + } + + @Provides + ListHabitsMenuBehavior.Screen getMenuScreen(ListHabitsScreen screen) + { + return screen; + } + + @Provides + ListHabitsBehavior.Screen getScreen(ListHabitsScreen screen) + { + return screen; + } + + @Provides + ListHabitsSelectionMenuBehavior.Adapter getSelMenuAdapter( + HabitCardListAdapter adapter) + { + return adapter; + } + + @Provides + ListHabitsSelectionMenuBehavior.Screen getSelMenuScreen(ListHabitsScreen screen) + { + return screen; + } + + @Provides + ListHabitsBehavior.System getSystem(BaseSystem system) + { + return system; + } +} diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsRootView.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsRootView.java similarity index 95% rename from app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsRootView.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsRootView.java index 538d8ae5a..92656a404 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsRootView.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsRootView.java @@ -25,14 +25,15 @@ import android.support.v7.widget.Toolbar; import android.view.*; import android.widget.*; +import org.isoron.androidbase.activities.*; import org.isoron.uhabits.R; -import org.isoron.uhabits.activities.*; import org.isoron.uhabits.activities.common.views.*; import org.isoron.uhabits.activities.habits.list.controllers.*; import org.isoron.uhabits.activities.habits.list.model.*; import org.isoron.uhabits.activities.habits.list.views.*; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.tasks.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.tasks.*; +import org.isoron.uhabits.core.ui.screens.habits.list.*; import org.isoron.uhabits.utils.*; import javax.inject.*; @@ -134,7 +135,8 @@ public class ListHabitsRootView extends BaseRootView listController.setSelectionListener(menu); listView.setController(listController); menu.setListController(listController); - header.setScrollController(new ScrollableChart.ScrollController() { + header.setScrollController(new ScrollableChart.ScrollController() + { @Override public void onDataOffsetChanged(int newDataOffset) { @@ -187,7 +189,8 @@ public class ListHabitsRootView extends BaseRootView private void updateProgressBar() { - postDelayed(() -> { + postDelayed(() -> + { int activeTaskCount = runner.getActiveTaskCount(); int newVisibility = activeTaskCount > 0 ? VISIBLE : GONE; if (progressBar.getVisibility() != newVisibility) diff --git a/app/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 similarity index 72% rename from app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreen.java index 6c0a6f9ce..1d6c6dbd6 100644 --- a/app/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 @@ -28,19 +28,24 @@ import android.text.*; import android.view.*; import android.widget.*; +import org.isoron.androidbase.activities.*; +import org.isoron.androidbase.utils.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.activities.*; import org.isoron.uhabits.activities.common.dialogs.*; -import org.isoron.uhabits.activities.common.dialogs.ColorPickerDialog.*; import org.isoron.uhabits.activities.habits.edit.*; -import org.isoron.uhabits.commands.*; +import org.isoron.uhabits.activities.habits.list.controllers.*; +import org.isoron.uhabits.core.commands.*; import org.isoron.uhabits.intents.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.ui.*; +import org.isoron.uhabits.core.ui.callbacks.*; +import org.isoron.uhabits.core.ui.screens.habits.list.*; import org.isoron.uhabits.preferences.*; import org.isoron.uhabits.utils.*; import java.io.*; import java.lang.reflect.*; +import java.util.*; import javax.inject.*; @@ -49,7 +54,9 @@ import static android.view.inputmethod.EditorInfo.*; @ActivityScope public class ListHabitsScreen extends BaseScreen - implements CommandRunner.Listener + implements CommandRunner.Listener, ListHabitsBehavior.Screen, + ListHabitsMenuBehavior.Screen, + ListHabitsSelectionMenuBehavior.Screen { public static final int REQUEST_OPEN_DOCUMENT = 6; @@ -87,7 +94,12 @@ public class ListHabitsScreen extends BaseScreen private final ThemeSwitcher themeSwitcher; @NonNull - private Preferences prefs; + private AndroidPreferences prefs; + + @Nullable + private HabitCardListController listController; + + private final ListHabitsRootView rootView; @Inject public ListHabitsScreen(@NonNull BaseActivity activity, @@ -98,10 +110,11 @@ public class ListHabitsScreen extends BaseScreen @NonNull ConfirmDeleteDialogFactory confirmDeleteDialogFactory, @NonNull ColorPickerDialogFactory colorPickerFactory, @NonNull EditHabitDialogFactory editHabitDialogFactory, - @NonNull Preferences prefs) + @NonNull AndroidPreferences prefs) { super(activity); setRootView(rootView); + this.rootView = rootView; this.prefs = prefs; this.colorPickerFactory = colorPickerFactory; this.commandRunner = commandRunner; @@ -111,6 +124,35 @@ public class ListHabitsScreen extends BaseScreen this.themeSwitcher = themeSwitcher; } + public void setListController(HabitCardListController listController) + { + this.listController = listController; + } + + @StringRes + private Integer getExecuteString(@NonNull Command command) + { + if(command instanceof ArchiveHabitsCommand) + return R.string.toast_habit_archived; + + if(command instanceof ChangeHabitColorCommand) + return R.string.toast_habit_changed; + + if(command instanceof CreateHabitCommand) + return R.string.toast_habit_created; + + if(command instanceof DeleteHabitsCommand) + return R.string.toast_habit_deleted; + + if(command instanceof EditHabitCommand) + return R.string.toast_habit_changed; + + if(command instanceof UnarchiveHabitsCommand) + return R.string.toast_habit_unarchived; + + return null; + } + public void onAttached() { commandRunner.addListener(this); @@ -120,8 +162,8 @@ public class ListHabitsScreen extends BaseScreen public void onCommandExecuted(@NonNull Command command, @Nullable Long refreshKey) { - if(command.isRemote()) return; - showMessage(command.getExecuteStringId()); + if (command.isRemote()) return; + showMessage(getExecuteString(command)); } public void onDettached() @@ -143,31 +185,39 @@ public class ListHabitsScreen extends BaseScreen this.controller = controller; } + @Override + public void applyTheme() + { + themeSwitcher.apply(); + activity.restartWithFade(ListHabitsActivity.class); + } + + @Override public void showAboutScreen() { Intent intent = intentFactory.startAboutActivity(activity); activity.startActivity(intent); } - /** - * Displays a {@link ColorPickerDialog} to the user. - *

- * The selected color on the dialog is the color of the given habit. - * - * @param habit the habit - * @param callback - */ - public void showColorPicker(@NonNull Habit habit, - @NonNull OnColorSelectedListener callback) - { - ColorPickerDialog picker = colorPickerFactory.create(habit.getColor()); + @Override + public void showColorPicker(int defaultColor, + @NonNull OnColorPickedCallback callback) { + ColorPickerDialog picker = colorPickerFactory.create(defaultColor); picker.setListener(callback); activity.showDialog(picker, "picker"); } + public void showCreateBooleanHabitScreen() + { + EditHabitDialog dialog; + dialog = editHabitDialogFactory.createBoolean(); + activity.showDialog(dialog, "editHabit"); + } + + @Override public void showCreateHabitScreen() { - if(!prefs.isNumericalHabitsFeatureEnabled()) + if (!prefs.isNumericalHabitsFeatureEnabled()) { showCreateBooleanHabitScreen(); return; @@ -175,8 +225,9 @@ public class ListHabitsScreen extends BaseScreen Dialog dialog = new AlertDialog.Builder(activity) .setTitle("Type of habit") - .setItems(R.array.habitTypes, (d, which) -> { - if(which == 0) showCreateBooleanHabitScreen(); + .setItems(R.array.habitTypes, (d, which) -> + { + if (which == 0) showCreateBooleanHabitScreen(); else showCreateNumericalHabitScreen(); }) .create(); @@ -184,38 +235,29 @@ public class ListHabitsScreen extends BaseScreen dialog.show(); } - private void showCreateNumericalHabitScreen() - { - EditHabitDialog dialog; - dialog = editHabitDialogFactory.createNumerical(); - activity.showDialog(dialog, "editHabit"); - } - - public void showCreateBooleanHabitScreen() - { - EditHabitDialog dialog; - dialog = editHabitDialogFactory.createBoolean(); - activity.showDialog(dialog, "editHabit"); - } - - public void showDeleteConfirmationScreen(ConfirmDeleteDialog.Callback callback) + @Override + public void showDeleteConfirmationScreen( + @NonNull OnConfirmedCallback callback) { activity.showDialog(confirmDeleteDialogFactory.create(callback)); } - public void showEditHabitScreen(Habit habit) + @Override + public void showEditHabitsScreen(List habits) { EditHabitDialog dialog; - dialog = editHabitDialogFactory.edit(habit); + dialog = editHabitDialogFactory.edit(habits.get(0)); activity.showDialog(dialog, "editNumericalHabit"); } + @Override public void showFAQScreen() { Intent intent = intentFactory.viewFAQ(activity); activity.startActivity(intent); } + @Override public void showHabitScreen(@NonNull Habit habit) { Intent intent = intentFactory.startShowHabitActivity(activity, habit); @@ -228,15 +270,49 @@ public class ListHabitsScreen extends BaseScreen activity.startActivityForResult(intent, REQUEST_OPEN_DOCUMENT); } + @Override public void showIntroScreen() { Intent intent = intentFactory.startIntroActivity(activity); activity.startActivity(intent); } + @Override + public void showMessage(@NonNull ListHabitsBehavior.Message m) + { + switch (m) + { + case COULD_NOT_EXPORT: + showMessage(R.string.could_not_export); + break; + + case IMPORT_SUCCESSFUL: + showMessage(R.string.habits_imported); + break; + + case IMPORT_FAILED: + showMessage(R.string.could_not_import); + break; + + case DATABASE_REPAIRED: + showMessage(R.string.database_repaired); + break; + + case COULD_NOT_GENERATE_BUG_REPORT: + showMessage(R.string.bug_report_failed); + break; + + case FILE_NOT_RECOGNIZED: + showMessage(R.string.file_not_recognized); + break; + } + } + + @Override public void showNumberPicker(double value, @NonNull String unit, - @NonNull NumberPickerCallback callback) + @NonNull + ListHabitsBehavior.NumberPickerCallback callback) { LayoutInflater inflater = activity.getLayoutInflater(); View view = inflater.inflate(R.layout.number_picker_dialog, null); @@ -285,35 +361,21 @@ public class ListHabitsScreen extends BaseScreen dialog.show(); } - private void refreshInitialValue(NumberPicker picker2) + @Override + public void showSendBugReportToDeveloperScreen(String log) { - // Workaround for a bug on Android: - // https://code.google.com/p/android/issues/detail?id=35482 - try - { - Field f = NumberPicker.class.getDeclaredField("mInputText"); - f.setAccessible(true); - EditText inputText = (EditText) f.get(picker2); - inputText.setFilters(new InputFilter[0]); - } - catch (Exception e) - { - throw new RuntimeException(e); - } + int to = R.string.bugReportTo; + int subject = R.string.bugReportSubject; + showSendEmailScreen(to, subject, log); } + @Override public void showSettingsScreen() { Intent intent = intentFactory.startSettingsActivity(activity); activity.startActivityForResult(intent, REQUEST_SETTINGS); } - public void toggleNightMode() - { - themeSwitcher.toggleNightMode(); - activity.restartWithFade(ListHabitsActivity.class); - } - private void onOpenDocumentResult(int resultCode, Intent data) { if (controller == null) return; @@ -366,8 +428,27 @@ public class ListHabitsScreen extends BaseScreen } } - public interface NumberPickerCallback + private void refreshInitialValue(NumberPicker picker2) { - void onNumberPicked(double newValue); + // Workaround for a bug on Android: + // https://code.google.com/p/android/issues/detail?id=35482 + try + { + Field f = NumberPicker.class.getDeclaredField("mInputText"); + f.setAccessible(true); + EditText inputText = (EditText) f.get(picker2); + inputText.setFilters(new InputFilter[0]); + } + catch (Exception e) + { + throw new RuntimeException(e); + } + } + + private void showCreateNumericalHabitScreen() + { + EditHabitDialog dialog; + dialog = editHabitDialogFactory.createNumerical(); + activity.showDialog(dialog, "editHabit"); } } diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsSelectionMenu.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsSelectionMenu.java similarity index 57% rename from app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsSelectionMenu.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsSelectionMenu.java index 9543fe352..6a1334b04 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsSelectionMenu.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsSelectionMenu.java @@ -22,14 +22,12 @@ package org.isoron.uhabits.activities.habits.list; import android.support.annotation.*; import android.view.*; +import org.isoron.androidbase.activities.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.commands.*; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.activities.*; import org.isoron.uhabits.activities.habits.list.controllers.*; import org.isoron.uhabits.activities.habits.list.model.*; - -import java.util.*; +import org.isoron.uhabits.core.commands.*; +import org.isoron.uhabits.core.ui.screens.habits.list.*; import javax.inject.*; @@ -43,25 +41,24 @@ public class ListHabitsSelectionMenu extends BaseSelectionMenu @NonNull CommandRunner commandRunner; + private ListHabitsSelectionMenuBehavior behavior; + @NonNull private final HabitCardListAdapter listAdapter; @Nullable private HabitCardListController listController; - @NonNull - private final HabitList habitList; - @Inject - public ListHabitsSelectionMenu(@NonNull HabitList habitList, - @NonNull ListHabitsScreen screen, + public ListHabitsSelectionMenu(@NonNull ListHabitsScreen screen, @NonNull HabitCardListAdapter listAdapter, - @NonNull CommandRunner commandRunner) + @NonNull CommandRunner commandRunner, + @NonNull ListHabitsSelectionMenuBehavior behavior) { - this.habitList = habitList; this.screen = screen; this.listAdapter = listAdapter; this.commandRunner = commandRunner; + this.behavior = behavior; } @Override @@ -74,34 +71,26 @@ public class ListHabitsSelectionMenu extends BaseSelectionMenu @Override public boolean onItemClicked(@NonNull MenuItem item) { - List selected = listAdapter.getSelected(); - if (selected.isEmpty()) return false; - - Habit firstHabit = selected.get(0); - switch (item.getItemId()) { case R.id.action_edit_habit: - showEditScreen(firstHabit); - finish(); + behavior.onEditHabits(); return true; case R.id.action_archive_habit: - performArchive(selected); - finish(); + behavior.onArchiveHabits(); return true; case R.id.action_unarchive_habit: - performUnarchive(selected); - finish(); + behavior.onUnarchiveHabits(); return true; case R.id.action_delete: - performDelete(selected); + behavior.onDeleteHabits(); return true; case R.id.action_color: - showColorPicker(selected, firstHabit); + behavior.onChangeColor(); return true; default: @@ -112,28 +101,16 @@ public class ListHabitsSelectionMenu extends BaseSelectionMenu @Override public boolean onPrepare(@NonNull Menu menu) { - List selected = listAdapter.getSelected(); - - boolean showEdit = (selected.size() == 1); - boolean showArchive = true; - boolean showUnarchive = true; - for (Habit h : selected) - { - if (h.isArchived()) showArchive = false; - else showUnarchive = false; - } - MenuItem itemEdit = menu.findItem(R.id.action_edit_habit); MenuItem itemColor = menu.findItem(R.id.action_color); MenuItem itemArchive = menu.findItem(R.id.action_archive_habit); MenuItem itemUnarchive = menu.findItem(R.id.action_unarchive_habit); itemColor.setVisible(true); - itemEdit.setVisible(showEdit); - itemArchive.setVisible(showArchive); - itemUnarchive.setVisible(showUnarchive); - - setTitle(Integer.toString(selected.size())); + itemEdit.setVisible(behavior.canEdit()); + itemArchive.setVisible(behavior.canArchive()); + itemUnarchive.setVisible(behavior.canUnarchive()); + setTitle(Integer.toString(listAdapter.getSelected().size())); return true; } @@ -166,41 +143,4 @@ public class ListHabitsSelectionMenu extends BaseSelectionMenu { return R.menu.list_habits_selection; } - - private void performArchive(@NonNull List selected) - { - commandRunner.execute(new ArchiveHabitsCommand(habitList, selected), - null); - } - - private void performDelete(@NonNull List selected) - { - screen.showDeleteConfirmationScreen(() -> { - listAdapter.performRemove(selected); - commandRunner.execute(new DeleteHabitsCommand(habitList, selected), - null); - finish(); - }); - } - - private void performUnarchive(@NonNull List selected) - { - commandRunner.execute(new UnarchiveHabitsCommand(habitList, selected), - null); - } - - private void showColorPicker(@NonNull List selected, - @NonNull Habit firstHabit) - { - screen.showColorPicker(firstHabit, color -> { - commandRunner.execute( - new ChangeHabitColorCommand(habitList, selected, color), null); - finish(); - }); - } - - private void showEditScreen(@NonNull Habit firstHabit) - { - screen.showEditHabitScreen(firstHabit); - } } diff --git a/app/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 similarity index 93% rename from app/src/main/java/org/isoron/uhabits/activities/habits/list/controllers/CheckmarkButtonController.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/controllers/CheckmarkButtonController.java index 382e12cda..735e53a62 100644 --- a/app/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 @@ -24,7 +24,7 @@ import android.support.annotation.*; import com.google.auto.factory.*; import org.isoron.uhabits.activities.habits.list.views.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.preferences.*; @AutoFactory @@ -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/app/src/main/java/org/isoron/uhabits/activities/habits/list/controllers/HabitCardController.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/controllers/HabitCardController.java similarity index 98% rename from app/src/main/java/org/isoron/uhabits/activities/habits/list/controllers/HabitCardController.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/controllers/HabitCardController.java index aa29f37c3..b4ea81ece 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/controllers/HabitCardController.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/controllers/HabitCardController.java @@ -22,7 +22,7 @@ package org.isoron.uhabits.activities.habits.list.controllers; import android.support.annotation.*; import org.isoron.uhabits.activities.habits.list.views.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; public class HabitCardController implements HabitCardView.Controller { diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/list/controllers/HabitCardListController.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/controllers/HabitCardListController.java similarity index 94% rename from app/src/main/java/org/isoron/uhabits/activities/habits/list/controllers/HabitCardListController.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/controllers/HabitCardListController.java index 0d62048bc..375cfa393 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/controllers/HabitCardListController.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/controllers/HabitCardListController.java @@ -21,16 +21,21 @@ package org.isoron.uhabits.activities.habits.list.controllers; import android.support.annotation.*; +import org.isoron.androidbase.activities.*; import org.isoron.uhabits.activities.habits.list.model.*; import org.isoron.uhabits.activities.habits.list.views.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; + +import javax.inject.*; /** * Controller responsible for receiving and processing the events generated by a * HabitListView. These include selecting and reordering items, toggling * checkmarks and clicking habits. */ -public class HabitCardListController implements HabitCardListView.Controller +@ActivityScope +public class HabitCardListController implements HabitCardListView.Controller, + ModelObservable.Listener { private final Mode NORMAL_MODE = new NormalMode(); @@ -48,10 +53,12 @@ public class HabitCardListController implements HabitCardListView.Controller @NonNull private Mode activeMode; + @Inject public HabitCardListController(@NonNull HabitCardListAdapter adapter) { this.adapter = adapter; this.activeMode = new NormalMode(); + adapter.getObservable().addListener(this); } /** @@ -119,6 +126,16 @@ public class HabitCardListController implements HabitCardListView.Controller activeMode.onItemLongClick(position); } + @Override + public void onModelChange() + { + if(adapter.isSelectionEmpty()) + { + activeMode = new NormalMode(); + if (selectionListener != null) selectionListener.onSelectionFinish(); + } + } + /** * Called when the selection operation is cancelled externally, by something * other than this controller. This happens, for example, when the user @@ -180,7 +197,6 @@ public class HabitCardListController implements HabitCardListView.Controller { adapter.clearSelection(); activeMode = new NormalMode(); - if (selectionListener != null) selectionListener.onSelectionFinish(); } diff --git a/app/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 similarity index 93% rename from app/src/main/java/org/isoron/uhabits/activities/habits/list/controllers/NumberButtonController.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/controllers/NumberButtonController.java index 0cd31fe20..972d9895b 100644 --- a/app/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 @@ -24,7 +24,7 @@ import android.support.annotation.*; import com.google.auto.factory.*; import org.isoron.uhabits.activities.habits.list.views.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.preferences.*; @AutoFactory @@ -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/app/src/main/java/org/isoron/uhabits/activities/habits/list/controllers/package-info.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/controllers/package-info.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/activities/habits/list/controllers/package-info.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/controllers/package-info.java diff --git a/app/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 similarity index 90% rename from app/src/main/java/org/isoron/uhabits/activities/habits/list/model/HabitCardListAdapter.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/model/HabitCardListAdapter.java index 949794fbf..b2b3c86a4 100644 --- a/app/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 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016 Álinson Santos Xavier + * Copyright (C) 2017 Álinson Santos Xavier * * This file is part of Loop Habit Tracker. * @@ -23,12 +23,13 @@ import android.support.annotation.*; import android.support.v7.widget.*; import android.view.*; -import org.isoron.uhabits.activities.*; +import org.isoron.androidbase.activities.*; import org.isoron.uhabits.activities.habits.list.*; import org.isoron.uhabits.activities.habits.list.views.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.ui.screens.habits.list.*; +import org.isoron.uhabits.core.utils.*; import org.isoron.uhabits.preferences.*; -import org.isoron.uhabits.utils.*; import java.util.*; @@ -42,8 +43,11 @@ import javax.inject.*; */ @ActivityScope public class HabitCardListAdapter - extends RecyclerView.Adapter - implements HabitCardListCache.Listener, MidnightTimer.MidnightListener + extends RecyclerView.Adapter implements + HabitCardListCache.Listener, + MidnightTimer.MidnightListener, + ListHabitsMenuBehavior.Adapter, + ListHabitsSelectionMenuBehavior.Adapter { @NonNull private ModelObservable observable; @@ -58,13 +62,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; @@ -95,10 +99,12 @@ public class HabitCardListAdapter /** * Sets all items as not selected. */ + @Override public void clearSelection() { selected.clear(); notifyDataSetChanged(); + observable.notifyListeners(); } /** @@ -133,6 +139,7 @@ public class HabitCardListAdapter return observable; } + @Override @NonNull public List getSelected() { @@ -255,6 +262,7 @@ public class HabitCardListAdapter * * @param habits list of habits to be removed */ + @Override public void performRemove(List habits) { for (Habit h : habits) @@ -278,11 +286,13 @@ public class HabitCardListAdapter cache.reorder(from, to); } + @Override public void refresh() { cache.refreshAllHabits(); } + @Override public void setFilter(HabitMatcher matcher) { cache.setFilter(matcher); @@ -300,6 +310,7 @@ public class HabitCardListAdapter this.listView = listView; } + @Override public void setOrder(HabitList.Order order) { cache.setOrder(order); diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/list/model/HabitCardViewHolder.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/model/HabitCardViewHolder.java similarity index 93% rename from app/src/main/java/org/isoron/uhabits/activities/habits/list/model/HabitCardViewHolder.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/model/HabitCardViewHolder.java index 494801e48..8d53e089c 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/model/HabitCardViewHolder.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/model/HabitCardViewHolder.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/main/java/org/isoron/uhabits/activities/habits/list/package-info.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/package-info.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/activities/habits/list/package-info.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/package-info.java diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.java similarity index 98% rename from app/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.java index 5b34e1e6a..478ef3597 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkButtonView.java @@ -32,7 +32,7 @@ import org.isoron.uhabits.activities.habits.list.controllers.*; import org.isoron.uhabits.utils.*; import static android.view.View.MeasureSpec.*; -import static org.isoron.uhabits.models.Checkmark.*; +import static org.isoron.uhabits.core.models.Checkmark.*; import static org.isoron.uhabits.utils.AttributeSetUtils.*; import static org.isoron.uhabits.utils.InterfaceUtils.getDimension; import static org.isoron.uhabits.utils.InterfaceUtils.getFontAwesome; diff --git a/app/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 similarity index 97% rename from app/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelView.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/CheckmarkPanelView.java index c61c378ce..301317d23 100644 --- a/app/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 @@ -27,9 +27,9 @@ import android.widget.*; import org.isoron.uhabits.*; import org.isoron.uhabits.activities.habits.list.*; import org.isoron.uhabits.activities.habits.list.controllers.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.utils.*; import org.isoron.uhabits.preferences.*; -import org.isoron.uhabits.utils.*; import java.util.*; @@ -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/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.java similarity index 99% rename from app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.java index c827c8afb..975902cc8 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardListView.java @@ -30,7 +30,7 @@ import android.view.*; import org.isoron.uhabits.activities.common.views.*; import org.isoron.uhabits.activities.habits.list.controllers.*; import org.isoron.uhabits.activities.habits.list.model.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import java.util.*; diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.java similarity index 99% rename from app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.java index 0200471a9..5aeeae9c7 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.java @@ -31,7 +31,8 @@ import android.widget.*; import org.isoron.uhabits.*; import org.isoron.uhabits.activities.common.views.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.utils.*; import org.isoron.uhabits.utils.*; import java.util.*; diff --git a/app/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 similarity index 92% rename from app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HeaderView.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HeaderView.java index 12e0b11b9..b126742f1 100644 --- a/app/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,7 @@ 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.core.utils.*; import org.isoron.uhabits.preferences.*; import org.isoron.uhabits.utils.*; @@ -36,13 +36,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 +52,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); @@ -70,13 +70,7 @@ public class HeaderView extends ScrollableChart { HabitsApplication app = (HabitsApplication) appContext; prefs = app.getComponent().getPreferences(); - } - - if (context instanceof ListHabitsActivity) - { - ListHabitsComponent component = - ((ListHabitsActivity) context).getListHabitsComponent(); - midnightTimer = component.getMidnightTimer(); + midnightTimer = app.getComponent().getMidnightTimer(); } init(); diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HintView.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HintView.java similarity index 98% rename from app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HintView.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HintView.java index f083b6fd2..1848b4827 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/HintView.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HintView.java @@ -29,7 +29,7 @@ import android.widget.FrameLayout; import android.widget.TextView; import org.isoron.uhabits.R; -import org.isoron.uhabits.activities.habits.list.model.HintList; +import org.isoron.uhabits.core.ui.screens.habits.list.HintList; import java.util.Random; diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberButtonView.java diff --git a/app/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 similarity index 97% rename from app/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelView.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/NumberPanelView.java index 1397d0446..0f8ca0991 100644 --- a/app/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 @@ -27,9 +27,9 @@ import android.widget.*; import org.isoron.uhabits.*; import org.isoron.uhabits.activities.habits.list.*; import org.isoron.uhabits.activities.habits.list.controllers.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.utils.*; import org.isoron.uhabits.preferences.*; -import org.isoron.uhabits.utils.*; import java.util.*; @@ -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/app/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 similarity index 71% rename from app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitActivity.java index 7d9a90eef..72287711c 100644 --- a/app/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 @@ -24,9 +24,9 @@ import android.net.*; import android.os.*; import android.support.annotation.*; +import org.isoron.androidbase.activities.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.activities.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; /** * Activity that allows the user to see more information about a single habit. @@ -35,7 +35,14 @@ import org.isoron.uhabits.models.*; */ public class ShowHabitActivity extends BaseActivity { - private HabitList habits; + @Nullable + private HabitList habitList; + + @Nullable + private HabitsComponent appComponent; + + @Nullable + private ShowHabitScreen screen; @Override protected void onCreate(Bundle savedInstanceState) @@ -43,31 +50,40 @@ 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 .builder() - .appComponent(app.getComponent()) + .habitsComponent(app.getComponent()) .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/app/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 similarity index 80% rename from app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitComponent.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitComponent.java index e1974c23e..f298f715b 100644 --- a/app/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,21 +19,27 @@ 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.*; import dagger.*; @ActivityScope @Component(modules = { ShowHabitModule.class }, - dependencies = { AppComponent.class }) + dependencies = { HabitsComponent.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 new file mode 100644 index 000000000..4cbf41b13 --- /dev/null +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitController.java @@ -0,0 +1,61 @@ +/* + * 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.support.annotation.*; + +import org.isoron.uhabits.activities.common.dialogs.*; +import org.isoron.uhabits.activities.habits.show.views.*; +import org.isoron.uhabits.core.ui.screens.habits.show.*; + +import javax.inject.*; + +public class ShowHabitController + implements HistoryCard.Controller, HistoryEditorDialog.Controller +{ + private ShowHabitBehavior behavior; + + private ShowHabitScreen screen; + + @Inject + public ShowHabitController(@NonNull ShowHabitBehavior behavior, + @NonNull ShowHabitScreen screen) + { + this.behavior = behavior; + this.screen = screen; + } + + @Override + public void onEditHistoryButtonClick() + { + behavior.onEditHistory(); + } + + @Override + public void onToggleCheckmark(long timestamp) + { + behavior.onToggleCheckmark(timestamp); + } + + 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 new file mode 100644 index 000000000..cca8d7a0e --- /dev/null +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitModule.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.activities.habits.show; + +import android.support.annotation.*; + +import org.isoron.androidbase.*; +import org.isoron.androidbase.activities.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.ui.screens.habits.show.*; + +import dagger.*; + +@Module +public class ShowHabitModule extends ActivityModule +{ + private Habit habit; + + public ShowHabitModule(@NonNull BaseActivity activity, @NonNull Habit habit) + { + super(activity); + this.habit = habit; + } + + @Provides + public Habit getHabit() + { + 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(BaseSystem system) + { + return system; + } +} diff --git a/app/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 similarity index 85% rename from app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitRootView.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitRootView.java index 7c2f16364..28e899118 100644 --- a/app/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 @@ -24,10 +24,10 @@ import android.os.*; import android.support.annotation.*; import android.support.v7.widget.*; +import org.isoron.androidbase.activities.*; import org.isoron.uhabits.R; -import org.isoron.uhabits.activities.*; import org.isoron.uhabits.activities.habits.show.views.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.utils.*; import javax.inject.*; @@ -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/app/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 similarity index 69% rename from app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitScreen.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitScreen.java index ec61d3b8f..f5b3bf622 100644 --- a/app/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 @@ -21,15 +21,18 @@ package org.isoron.uhabits.activities.habits.show; import android.support.annotation.*; -import org.isoron.uhabits.activities.*; +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.core.models.*; +import org.isoron.uhabits.core.ui.screens.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/app/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 similarity index 56% rename from app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitsMenu.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitsMenu.java index 03f688a06..506e381ff 100644 --- a/app/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,12 +22,9 @@ package org.isoron.uhabits.activities.habits.show; import android.support.annotation.*; import android.view.*; +import org.isoron.androidbase.activities.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.activities.*; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.tasks.*; - -import java.util.*; +import org.isoron.uhabits.core.ui.screens.habits.show.*; import javax.inject.*; @@ -35,40 +32,14 @@ import javax.inject.*; public class ShowHabitsMenu extends BaseMenu { @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 ShowHabitScreen screen, - @NonNull Habit habit, - @NonNull ExportCSVTaskFactory exportCSVFactory, - @NonNull TaskRunner taskRunner) + @NonNull ShowHabitMenuBehavior behavior) { super(activity); - this.screen = screen; - this.habit = habit; - this.taskRunner = taskRunner; - this.exportCSVFactory = exportCSVFactory; - } - - public void exportHabit() - { - List selected = new LinkedList<>(); - selected.add(habit); - ExportCSVTask task = exportCSVFactory.create(selected, filename -> { - if (filename != null) screen.showSendFileScreen(filename); - else screen.showMessage(R.string.could_not_export); - }); - taskRunner.execute(task); + this.behavior = behavior; } @Override @@ -77,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/app/src/main/java/org/isoron/uhabits/activities/habits/show/package-info.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/package-info.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/activities/habits/show/package-info.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/package-info.java diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/show/views/BarCard.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/BarCard.java similarity index 96% rename from app/src/main/java/org/isoron/uhabits/activities/habits/show/views/BarCard.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/BarCard.java index edf876f33..a2a2ae5e4 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/show/views/BarCard.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/BarCard.java @@ -27,8 +27,9 @@ import android.widget.*; import org.isoron.uhabits.*; import org.isoron.uhabits.R; import org.isoron.uhabits.activities.common.views.*; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.tasks.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.tasks.*; +import org.isoron.uhabits.core.utils.*; import org.isoron.uhabits.utils.*; import java.util.*; diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/show/views/FrequencyCard.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/FrequencyCard.java similarity index 97% rename from app/src/main/java/org/isoron/uhabits/activities/habits/show/views/FrequencyCard.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/FrequencyCard.java index d9b6c2786..629aa340e 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/show/views/FrequencyCard.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/FrequencyCard.java @@ -27,8 +27,8 @@ import android.widget.*; import org.isoron.uhabits.*; import org.isoron.uhabits.R; import org.isoron.uhabits.activities.common.views.*; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.tasks.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.tasks.*; import org.isoron.uhabits.utils.*; import java.util.*; diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/show/views/HabitCard.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/HabitCard.java similarity index 96% rename from app/src/main/java/org/isoron/uhabits/activities/habits/show/views/HabitCard.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/HabitCard.java index 0c31112d6..255b518e1 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/show/views/HabitCard.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/HabitCard.java @@ -24,8 +24,8 @@ import android.support.annotation.*; import android.util.*; import android.widget.*; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.models.memory.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.models.memory.*; public abstract class HabitCard extends LinearLayout implements ModelObservable.Listener diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/show/views/HistoryCard.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/HistoryCard.java similarity index 97% rename from app/src/main/java/org/isoron/uhabits/activities/habits/show/views/HistoryCard.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/HistoryCard.java index 248285cbd..4ac90b5af 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/show/views/HistoryCard.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/HistoryCard.java @@ -27,8 +27,8 @@ import android.widget.*; import org.isoron.uhabits.*; import org.isoron.uhabits.R; import org.isoron.uhabits.activities.common.views.*; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.tasks.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.tasks.*; import org.isoron.uhabits.utils.*; import butterknife.*; diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/show/views/OverviewCard.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/OverviewCard.java similarity index 97% rename from app/src/main/java/org/isoron/uhabits/activities/habits/show/views/OverviewCard.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/OverviewCard.java index 080c8e4c6..f98d738e4 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/show/views/OverviewCard.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/OverviewCard.java @@ -27,8 +27,9 @@ import android.widget.*; import org.isoron.uhabits.*; import org.isoron.uhabits.R; import org.isoron.uhabits.activities.common.views.*; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.tasks.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.tasks.*; +import org.isoron.uhabits.core.utils.*; import org.isoron.uhabits.utils.*; import butterknife.*; diff --git a/app/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 similarity index 96% rename from app/src/main/java/org/isoron/uhabits/activities/habits/show/views/ScoreCard.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/ScoreCard.java index cbb278310..65c242c9d 100644 --- a/app/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 @@ -27,9 +27,10 @@ import android.widget.*; import org.isoron.uhabits.*; import org.isoron.uhabits.R; import org.isoron.uhabits.activities.common.views.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.tasks.*; +import org.isoron.uhabits.core.utils.*; import org.isoron.uhabits.preferences.*; -import org.isoron.uhabits.tasks.*; import org.isoron.uhabits.utils.*; import java.util.*; @@ -55,7 +56,7 @@ public class ScoreCard extends HabitCard private TaskRunner taskRunner; @Nullable - private Preferences prefs; + private AndroidPreferences prefs; public ScoreCard(Context context) { diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/show/views/StreakCard.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/StreakCard.java similarity index 97% rename from app/src/main/java/org/isoron/uhabits/activities/habits/show/views/StreakCard.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/StreakCard.java index d1607e973..bf5c24ff1 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/show/views/StreakCard.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/StreakCard.java @@ -27,8 +27,8 @@ import android.widget.*; import org.isoron.uhabits.*; import org.isoron.uhabits.R; import org.isoron.uhabits.activities.common.views.*; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.tasks.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.tasks.*; import org.isoron.uhabits.utils.*; import java.util.*; diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/show/views/SubtitleCard.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/SubtitleCard.java similarity index 96% rename from app/src/main/java/org/isoron/uhabits/activities/habits/show/views/SubtitleCard.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/SubtitleCard.java index 52a1fe9ad..07b712f73 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/show/views/SubtitleCard.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/SubtitleCard.java @@ -26,7 +26,7 @@ import android.util.*; import android.widget.*; import org.isoron.uhabits.R; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.utils.*; import butterknife.*; @@ -108,7 +108,7 @@ public class SubtitleCard extends HabitCard private void updateReminderText(Reminder reminder) { reminderLabel.setText( - DateUtils.formatTime(getContext(), reminder.getHour(), + AndroidDateUtils.formatTime(getContext(), reminder.getHour(), reminder.getMinute())); } } diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/show/views/package-info.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/package-info.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/activities/habits/show/views/package-info.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/show/views/package-info.java diff --git a/app/src/main/java/org/isoron/uhabits/activities/intro/IntroActivity.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/intro/IntroActivity.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/activities/intro/IntroActivity.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/intro/IntroActivity.java diff --git a/app/src/main/java/org/isoron/uhabits/activities/intro/package-info.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/intro/package-info.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/activities/intro/package-info.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/intro/package-info.java diff --git a/app/src/main/java/org/isoron/uhabits/activities/package-info.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/package-info.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/activities/package-info.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/package-info.java diff --git a/app/src/main/java/org/isoron/uhabits/activities/settings/SettingsActivity.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsActivity.java similarity index 97% rename from app/src/main/java/org/isoron/uhabits/activities/settings/SettingsActivity.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsActivity.java index 914e7e714..15bfce36f 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/settings/SettingsActivity.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsActivity.java @@ -21,8 +21,8 @@ package org.isoron.uhabits.activities.settings; import android.os.*; +import org.isoron.androidbase.activities.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.activities.*; import org.isoron.uhabits.utils.*; /** diff --git a/app/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.java similarity index 93% rename from app/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.java index 0f9ee800d..2cc1cd7d5 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.java @@ -25,10 +25,11 @@ import android.os.*; import android.support.annotation.*; import android.support.v7.preference.*; +import org.isoron.androidbase.activities.*; import org.isoron.uhabits.*; import org.isoron.uhabits.R; +import org.isoron.uhabits.notifications.*; import org.isoron.uhabits.preferences.*; -import org.isoron.uhabits.utils.*; import static org.isoron.uhabits.activities.habits.list.ListHabitsScreen.*; @@ -40,14 +41,14 @@ 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) { if (requestCode == RINGTONE_REQUEST_CODE) { - RingtoneUtils.parseRingtoneData(getContext(), data); + RingtoneManager.parseRingtoneData(getContext(), data); updateRingtoneDescription(); return; } @@ -113,7 +114,7 @@ public class SettingsFragment extends PreferenceFragmentCompat if (key.equals("reminderSound")) { - RingtoneUtils.startRingtonePickerActivity(this, + BaseScreen.showRingtonePicker(this, RINGTONE_REQUEST_CODE); return true; } @@ -158,7 +159,7 @@ public class SettingsFragment extends PreferenceFragmentCompat private void updateRingtoneDescription() { - String ringtoneName = RingtoneUtils.getRingtoneName(getContext()); + String ringtoneName = RingtoneManager.getRingtoneName(getContext()); if (ringtoneName == null) return; Preference ringtonePreference = findPreference("reminderSound"); ringtonePreference.setSummary(ringtoneName); diff --git a/app/src/main/java/org/isoron/uhabits/activities/settings/package-info.java b/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/package-info.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/activities/settings/package-info.java rename to uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/package-info.java diff --git a/app/src/main/java/org/isoron/uhabits/automation/EditSettingActivity.java b/uhabits-android/src/main/java/org/isoron/uhabits/automation/EditSettingActivity.java similarity index 95% rename from app/src/main/java/org/isoron/uhabits/automation/EditSettingActivity.java rename to uhabits-android/src/main/java/org/isoron/uhabits/automation/EditSettingActivity.java index d92e73480..c0ec8a2a3 100644 --- a/app/src/main/java/org/isoron/uhabits/automation/EditSettingActivity.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/automation/EditSettingActivity.java @@ -21,9 +21,9 @@ package org.isoron.uhabits.automation; import android.os.*; +import org.isoron.androidbase.activities.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.activities.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; public class EditSettingActivity extends BaseActivity { diff --git a/app/src/main/java/org/isoron/uhabits/automation/EditSettingController.java b/uhabits-android/src/main/java/org/isoron/uhabits/automation/EditSettingController.java similarity index 98% rename from app/src/main/java/org/isoron/uhabits/automation/EditSettingController.java rename to uhabits-android/src/main/java/org/isoron/uhabits/automation/EditSettingController.java index 478170496..e18b2c367 100644 --- a/app/src/main/java/org/isoron/uhabits/automation/EditSettingController.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/automation/EditSettingController.java @@ -25,7 +25,7 @@ import android.os.*; import android.support.annotation.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import static org.isoron.uhabits.automation.FireSettingReceiver.*; diff --git a/app/src/main/java/org/isoron/uhabits/automation/EditSettingRootView.java b/uhabits-android/src/main/java/org/isoron/uhabits/automation/EditSettingRootView.java similarity index 97% rename from app/src/main/java/org/isoron/uhabits/automation/EditSettingRootView.java rename to uhabits-android/src/main/java/org/isoron/uhabits/automation/EditSettingRootView.java index 10fad0a0d..80ab1632a 100644 --- a/app/src/main/java/org/isoron/uhabits/automation/EditSettingRootView.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/automation/EditSettingRootView.java @@ -25,9 +25,9 @@ import android.support.v7.widget.*; import android.support.v7.widget.Toolbar; import android.widget.*; +import org.isoron.androidbase.activities.*; import org.isoron.uhabits.R; -import org.isoron.uhabits.activities.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.utils.*; import java.util.*; diff --git a/app/src/main/java/org/isoron/uhabits/automation/FireSettingReceiver.java b/uhabits-android/src/main/java/org/isoron/uhabits/automation/FireSettingReceiver.java similarity index 89% rename from app/src/main/java/org/isoron/uhabits/automation/FireSettingReceiver.java rename to uhabits-android/src/main/java/org/isoron/uhabits/automation/FireSettingReceiver.java index 7ff6af588..d16ce1d9c 100644 --- a/app/src/main/java/org/isoron/uhabits/automation/FireSettingReceiver.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/automation/FireSettingReceiver.java @@ -23,9 +23,10 @@ import android.content.*; import android.os.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.receivers.*; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.ui.widgets.*; +import org.isoron.uhabits.core.utils.*; import dagger.*; @@ -54,7 +55,7 @@ public class FireSettingReceiver extends BroadcastReceiver ReceiverComponent component = DaggerFireSettingReceiver_ReceiverComponent .builder() - .appComponent(app.getComponent()) + .habitsComponent(app.getComponent()) .build(); allHabits = app.getComponent().getHabitList(); @@ -63,7 +64,7 @@ public class FireSettingReceiver extends BroadcastReceiver if (args == null) return; long timestamp = DateUtils.getStartOfToday(); - WidgetController controller = component.getWidgetController(); + WidgetBehavior controller = component.getWidgetController(); switch (args.action) { @@ -99,10 +100,10 @@ public class FireSettingReceiver extends BroadcastReceiver } @ReceiverScope - @Component(dependencies = AppComponent.class) + @Component(dependencies = HabitsComponent.class) interface ReceiverComponent { - WidgetController getWidgetController(); + WidgetBehavior getWidgetController(); } private class Arguments diff --git a/app/src/main/java/org/isoron/uhabits/intents/IntentFactory.java b/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentFactory.java similarity index 97% rename from app/src/main/java/org/isoron/uhabits/intents/IntentFactory.java rename to uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentFactory.java index 76b56243a..366483156 100644 --- a/app/src/main/java/org/isoron/uhabits/intents/IntentFactory.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentFactory.java @@ -28,7 +28,7 @@ import org.isoron.uhabits.activities.about.*; import org.isoron.uhabits.activities.habits.show.*; import org.isoron.uhabits.activities.intro.*; import org.isoron.uhabits.activities.settings.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import javax.inject.*; @@ -83,7 +83,7 @@ public class IntentFactory public Intent startShowHabitActivity(Context context, Habit habit) { Intent intent = new Intent(context, ShowHabitActivity.class); - intent.setData(habit.getUri()); + intent.setData(Uri.parse(habit.getUriString())); return intent; } diff --git a/app/src/main/java/org/isoron/uhabits/intents/IntentParser.java b/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentParser.java similarity index 95% rename from app/src/main/java/org/isoron/uhabits/intents/IntentParser.java rename to uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentParser.java index a6dc23e3f..2ae83cce0 100644 --- a/app/src/main/java/org/isoron/uhabits/intents/IntentParser.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentParser.java @@ -23,9 +23,9 @@ import android.content.*; import android.net.*; import android.support.annotation.*; -import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.utils.*; import javax.inject.*; diff --git a/app/src/main/java/org/isoron/uhabits/intents/IntentScheduler.java b/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentScheduler.java similarity index 95% rename from app/src/main/java/org/isoron/uhabits/intents/IntentScheduler.java rename to uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentScheduler.java index a53547654..bd8cc5d77 100644 --- a/app/src/main/java/org/isoron/uhabits/intents/IntentScheduler.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/intents/IntentScheduler.java @@ -24,7 +24,8 @@ import android.content.*; import android.os.*; import android.support.annotation.*; -import org.isoron.uhabits.*; +import org.isoron.androidbase.*; +import org.isoron.uhabits.core.*; import javax.inject.*; diff --git a/app/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.java b/uhabits-android/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.java similarity index 91% rename from app/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.java rename to uhabits-android/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.java index 415f9237a..26f87fe76 100644 --- a/app/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/intents/PendingIntentFactory.java @@ -24,8 +24,9 @@ import android.content.*; import android.net.*; import android.support.annotation.*; -import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.androidbase.*; +import org.isoron.uhabits.core.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.receivers.*; import javax.inject.*; @@ -51,7 +52,7 @@ public class PendingIntentFactory @Nullable Long timestamp) { Intent checkIntent = new Intent(context, WidgetReceiver.class); - checkIntent.setData(habit.getUri()); + checkIntent.setData(Uri.parse(habit.getUriString())); checkIntent.setAction(WidgetReceiver.ACTION_ADD_REPETITION); if (timestamp != null) checkIntent.putExtra("timestamp", timestamp); return PendingIntent.getBroadcast(context, 1, checkIntent, @@ -62,7 +63,7 @@ public class PendingIntentFactory { Intent deleteIntent = new Intent(context, ReminderReceiver.class); deleteIntent.setAction(WidgetReceiver.ACTION_DISMISS_REMINDER); - deleteIntent.setData(habit.getUri()); + deleteIntent.setData(Uri.parse(habit.getUriString())); return PendingIntent.getBroadcast(context, 0, deleteIntent, FLAG_UPDATE_CURRENT); } @@ -81,7 +82,7 @@ public class PendingIntentFactory @Nullable Long reminderTime, long timestamp) { - Uri uri = habit.getUri(); + Uri uri = Uri.parse(habit.getUriString()); Intent intent = new Intent(context, ReminderReceiver.class); intent.setAction(ReminderReceiver.ACTION_SHOW_REMINDER); @@ -95,7 +96,7 @@ public class PendingIntentFactory public PendingIntent snoozeNotification(@NonNull Habit habit) { - Uri data = habit.getUri(); + Uri data = Uri.parse(habit.getUriString()); Intent snoozeIntent = new Intent(context, ReminderReceiver.class); snoozeIntent.setData(data); snoozeIntent.setAction(ReminderReceiver.ACTION_SNOOZE_REMINDER); @@ -106,7 +107,7 @@ public class PendingIntentFactory public PendingIntent toggleCheckmark(@NonNull Habit habit, @Nullable Long timestamp) { - Uri data = habit.getUri(); + Uri data = Uri.parse(habit.getUriString()); Intent checkIntent = new Intent(context, WidgetReceiver.class); checkIntent.setData(data); checkIntent.setAction(WidgetReceiver.ACTION_TOGGLE_REPETITION); diff --git a/app/src/main/java/org/isoron/uhabits/io/AbstractImporter.java b/uhabits-android/src/main/java/org/isoron/uhabits/io/AbstractImporter.java similarity index 97% rename from app/src/main/java/org/isoron/uhabits/io/AbstractImporter.java rename to uhabits-android/src/main/java/org/isoron/uhabits/io/AbstractImporter.java index d20979e78..28f5e028a 100644 --- a/app/src/main/java/org/isoron/uhabits/io/AbstractImporter.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/io/AbstractImporter.java @@ -21,7 +21,7 @@ package org.isoron.uhabits.io; import android.support.annotation.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import java.io.*; import java.util.*; diff --git a/app/src/main/java/org/isoron/uhabits/io/GenericImporter.java b/uhabits-android/src/main/java/org/isoron/uhabits/io/GenericImporter.java similarity index 98% rename from app/src/main/java/org/isoron/uhabits/io/GenericImporter.java rename to uhabits-android/src/main/java/org/isoron/uhabits/io/GenericImporter.java index dcdf9e354..6c843f31d 100644 --- a/app/src/main/java/org/isoron/uhabits/io/GenericImporter.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/io/GenericImporter.java @@ -21,7 +21,7 @@ package org.isoron.uhabits.io; import android.support.annotation.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import java.io.*; import java.util.*; diff --git a/app/src/main/java/org/isoron/uhabits/io/HabitBullCSVImporter.java b/uhabits-android/src/main/java/org/isoron/uhabits/io/HabitBullCSVImporter.java similarity index 95% rename from app/src/main/java/org/isoron/uhabits/io/HabitBullCSVImporter.java rename to uhabits-android/src/main/java/org/isoron/uhabits/io/HabitBullCSVImporter.java index 42fb9b09b..cbfa366c5 100644 --- a/app/src/main/java/org/isoron/uhabits/io/HabitBullCSVImporter.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/io/HabitBullCSVImporter.java @@ -24,8 +24,8 @@ import android.support.annotation.*; import com.activeandroid.*; import com.opencsv.*; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.utils.*; import java.io.*; import java.util.*; @@ -108,7 +108,7 @@ public class HabitBullCSVImporter extends AbstractImporter } if(!h.getRepetitions().containsTimestamp(timestamp)) - h.getRepetitions().toggleTimestamp(timestamp); + h.getRepetitions().toggle(timestamp); } } } diff --git a/app/src/main/java/org/isoron/uhabits/io/LoopDBImporter.java b/uhabits-android/src/main/java/org/isoron/uhabits/io/LoopDBImporter.java similarity index 96% rename from app/src/main/java/org/isoron/uhabits/io/LoopDBImporter.java rename to uhabits-android/src/main/java/org/isoron/uhabits/io/LoopDBImporter.java index bfcf5886f..3cd4b7cb0 100644 --- a/app/src/main/java/org/isoron/uhabits/io/LoopDBImporter.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/io/LoopDBImporter.java @@ -27,10 +27,11 @@ import android.util.*; import com.activeandroid.*; +import org.isoron.androidbase.*; +import org.isoron.androidbase.utils.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.utils.DatabaseUtils; -import org.isoron.uhabits.utils.*; import java.io.*; diff --git a/app/src/main/java/org/isoron/uhabits/io/RewireDBImporter.java b/uhabits-android/src/main/java/org/isoron/uhabits/io/RewireDBImporter.java similarity index 97% rename from app/src/main/java/org/isoron/uhabits/io/RewireDBImporter.java rename to uhabits-android/src/main/java/org/isoron/uhabits/io/RewireDBImporter.java index 0865671b7..11104c9fa 100644 --- a/app/src/main/java/org/isoron/uhabits/io/RewireDBImporter.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/io/RewireDBImporter.java @@ -23,9 +23,9 @@ import android.database.*; import android.database.sqlite.*; import android.support.annotation.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.utils.DatabaseUtils; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.utils.*; import java.io.*; import java.util.*; @@ -101,7 +101,7 @@ public class RewireDBImporter extends AbstractImporter GregorianCalendar cal = DateUtils.getStartOfTodayCalendar(); cal.set(year, month - 1, day); - habit.getRepetitions().toggleTimestamp(cal.getTimeInMillis()); + habit.getRepetitions().toggle(cal.getTimeInMillis()); } while (c.moveToNext()); } finally diff --git a/app/src/main/java/org/isoron/uhabits/io/TickmateDBImporter.java b/uhabits-android/src/main/java/org/isoron/uhabits/io/TickmateDBImporter.java similarity index 96% rename from app/src/main/java/org/isoron/uhabits/io/TickmateDBImporter.java rename to uhabits-android/src/main/java/org/isoron/uhabits/io/TickmateDBImporter.java index 2282f7293..fc7e7e05b 100644 --- a/app/src/main/java/org/isoron/uhabits/io/TickmateDBImporter.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/io/TickmateDBImporter.java @@ -23,9 +23,9 @@ import android.database.*; import android.database.sqlite.*; import android.support.annotation.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.utils.DatabaseUtils; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.utils.*; import java.io.*; import java.util.*; @@ -100,7 +100,7 @@ public class TickmateDBImporter extends AbstractImporter GregorianCalendar cal = DateUtils.getStartOfTodayCalendar(); cal.set(year, month, day); - habit.getRepetitions().toggleTimestamp(cal.getTimeInMillis()); + habit.getRepetitions().toggle(cal.getTimeInMillis()); } while (c.moveToNext()); } finally diff --git a/app/src/main/java/org/isoron/uhabits/io/package-info.java b/uhabits-android/src/main/java/org/isoron/uhabits/io/package-info.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/io/package-info.java rename to uhabits-android/src/main/java/org/isoron/uhabits/io/package-info.java diff --git a/app/src/main/java/org/isoron/uhabits/models/sqlite/InconsistentDatabaseException.java b/uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/InconsistentDatabaseException.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/models/sqlite/InconsistentDatabaseException.java rename to uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/InconsistentDatabaseException.java diff --git a/app/src/main/java/org/isoron/uhabits/models/sqlite/InvalidDatabaseVersionException.java b/uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/InvalidDatabaseVersionException.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/models/sqlite/InvalidDatabaseVersionException.java rename to uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/InvalidDatabaseVersionException.java diff --git a/app/src/main/java/org/isoron/uhabits/models/sqlite/SQLModelFactory.java b/uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/SQLModelFactory.java similarity index 96% rename from app/src/main/java/org/isoron/uhabits/models/sqlite/SQLModelFactory.java rename to uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/SQLModelFactory.java index 7cdbcbc4f..839a71aec 100644 --- a/app/src/main/java/org/isoron/uhabits/models/sqlite/SQLModelFactory.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/SQLModelFactory.java @@ -19,8 +19,8 @@ package org.isoron.uhabits.models.sqlite; -import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.*; +import org.isoron.uhabits.core.models.*; import dagger.*; diff --git a/app/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteCheckmarkList.java b/uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteCheckmarkList.java similarity index 98% rename from app/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteCheckmarkList.java rename to uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteCheckmarkList.java index c63e1e1fd..dc6f2e2d2 100644 --- a/app/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteCheckmarkList.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteCheckmarkList.java @@ -25,9 +25,9 @@ import android.support.annotation.Nullable; import com.activeandroid.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.utils.*; import org.isoron.uhabits.models.sqlite.records.*; -import org.isoron.uhabits.utils.*; import org.jetbrains.annotations.*; import java.util.*; diff --git a/app/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteHabitList.java b/uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteHabitList.java similarity index 99% rename from app/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteHabitList.java rename to uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteHabitList.java index c3449f65d..6f9106cbb 100644 --- a/app/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteHabitList.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteHabitList.java @@ -25,7 +25,7 @@ import com.activeandroid.query.*; import com.activeandroid.util.*; import org.apache.commons.lang3.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.models.sqlite.records.*; import java.util.*; @@ -261,7 +261,7 @@ public class SQLiteHabitList extends HabitList } } - protected synchronized List toList() + public synchronized List toList() { String query = buildSelectQuery(); List recordList = sqlite.query(query, null); diff --git a/app/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteRepetitionList.java b/uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteRepetitionList.java similarity index 99% rename from app/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteRepetitionList.java rename to uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteRepetitionList.java index 2d8b63bd0..1ebac67f7 100644 --- a/app/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteRepetitionList.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteRepetitionList.java @@ -27,7 +27,7 @@ import android.support.annotation.Nullable; import com.activeandroid.*; import com.activeandroid.query.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.models.sqlite.records.*; import org.jetbrains.annotations.*; diff --git a/app/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteScoreList.java b/uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteScoreList.java similarity index 99% rename from app/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteScoreList.java rename to uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteScoreList.java index 6b2e934f0..02e082cae 100644 --- a/app/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteScoreList.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteScoreList.java @@ -25,7 +25,7 @@ import android.support.annotation.Nullable; import com.activeandroid.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.models.sqlite.records.*; import org.jetbrains.annotations.*; diff --git a/app/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteStreakList.java b/uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteStreakList.java similarity index 98% rename from app/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteStreakList.java rename to uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteStreakList.java index 8d6068579..168b7313a 100644 --- a/app/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteStreakList.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteStreakList.java @@ -25,7 +25,8 @@ import android.support.annotation.Nullable; import com.activeandroid.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.utils.*; import org.isoron.uhabits.models.sqlite.records.*; import org.isoron.uhabits.utils.*; import org.jetbrains.annotations.*; diff --git a/app/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteUtils.java b/uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteUtils.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteUtils.java rename to uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/SQLiteUtils.java diff --git a/app/src/main/java/org/isoron/uhabits/models/sqlite/package-info.java b/uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/package-info.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/models/sqlite/package-info.java rename to uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/package-info.java diff --git a/app/src/main/java/org/isoron/uhabits/models/sqlite/records/CheckmarkRecord.java b/uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/records/CheckmarkRecord.java similarity index 97% rename from app/src/main/java/org/isoron/uhabits/models/sqlite/records/CheckmarkRecord.java rename to uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/records/CheckmarkRecord.java index 6938b505d..74c8e8a6d 100644 --- a/app/src/main/java/org/isoron/uhabits/models/sqlite/records/CheckmarkRecord.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/records/CheckmarkRecord.java @@ -24,7 +24,7 @@ import android.database.*; import com.activeandroid.*; import com.activeandroid.annotation.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; /** * The SQLite database record corresponding to a {@link Checkmark}. diff --git a/app/src/main/java/org/isoron/uhabits/models/sqlite/records/HabitRecord.java b/uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/records/HabitRecord.java similarity index 99% rename from app/src/main/java/org/isoron/uhabits/models/sqlite/records/HabitRecord.java rename to uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/records/HabitRecord.java index 6edafacda..5cd02bb65 100644 --- a/app/src/main/java/org/isoron/uhabits/models/sqlite/records/HabitRecord.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/records/HabitRecord.java @@ -28,7 +28,7 @@ import com.activeandroid.annotation.*; import com.activeandroid.query.*; import com.activeandroid.util.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.utils.DatabaseUtils; import java.lang.reflect.*; diff --git a/app/src/main/java/org/isoron/uhabits/models/sqlite/records/RepetitionRecord.java b/uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/records/RepetitionRecord.java similarity index 97% rename from app/src/main/java/org/isoron/uhabits/models/sqlite/records/RepetitionRecord.java rename to uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/records/RepetitionRecord.java index 874fd0954..b10b7c73e 100644 --- a/app/src/main/java/org/isoron/uhabits/models/sqlite/records/RepetitionRecord.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/records/RepetitionRecord.java @@ -24,7 +24,7 @@ import android.database.*; import com.activeandroid.*; import com.activeandroid.annotation.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; /** * The SQLite database record corresponding to a {@link Repetition}. diff --git a/app/src/main/java/org/isoron/uhabits/models/sqlite/records/SQLiteRecord.java b/uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/records/SQLiteRecord.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/models/sqlite/records/SQLiteRecord.java rename to uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/records/SQLiteRecord.java diff --git a/app/src/main/java/org/isoron/uhabits/models/sqlite/records/ScoreRecord.java b/uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/records/ScoreRecord.java similarity index 97% rename from app/src/main/java/org/isoron/uhabits/models/sqlite/records/ScoreRecord.java rename to uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/records/ScoreRecord.java index 69969edfb..0907d3115 100644 --- a/app/src/main/java/org/isoron/uhabits/models/sqlite/records/ScoreRecord.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/records/ScoreRecord.java @@ -24,7 +24,7 @@ import android.database.*; import com.activeandroid.*; import com.activeandroid.annotation.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; /** * The SQLite database record corresponding to a Score. diff --git a/app/src/main/java/org/isoron/uhabits/models/sqlite/records/StreakRecord.java b/uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/records/StreakRecord.java similarity index 98% rename from app/src/main/java/org/isoron/uhabits/models/sqlite/records/StreakRecord.java rename to uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/records/StreakRecord.java index 1638089db..a16878ea3 100644 --- a/app/src/main/java/org/isoron/uhabits/models/sqlite/records/StreakRecord.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/records/StreakRecord.java @@ -24,7 +24,7 @@ import android.database.*; import com.activeandroid.*; import com.activeandroid.annotation.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import java.lang.reflect.*; diff --git a/app/src/main/java/org/isoron/uhabits/models/sqlite/records/package-info.java b/uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/records/package-info.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/models/sqlite/records/package-info.java rename to uhabits-android/src/main/java/org/isoron/uhabits/models/sqlite/records/package-info.java diff --git a/app/src/main/java/org/isoron/uhabits/notifications/NotificationTray.java b/uhabits-android/src/main/java/org/isoron/uhabits/notifications/AndroidNotificationTray.java similarity index 88% rename from app/src/main/java/org/isoron/uhabits/notifications/NotificationTray.java rename to uhabits-android/src/main/java/org/isoron/uhabits/notifications/AndroidNotificationTray.java index 838e4b4a1..73039b6e6 100644 --- a/app/src/main/java/org/isoron/uhabits/notifications/NotificationTray.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/notifications/AndroidNotificationTray.java @@ -26,24 +26,28 @@ import android.support.annotation.*; import android.support.v4.app.*; import android.support.v4.app.NotificationCompat.*; +import org.isoron.androidbase.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.commands.*; +import org.isoron.uhabits.core.*; +import org.isoron.uhabits.core.commands.*; import org.isoron.uhabits.intents.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.tasks.*; +import org.isoron.uhabits.core.ui.*; +import org.isoron.uhabits.core.utils.*; import org.isoron.uhabits.preferences.*; -import org.isoron.uhabits.tasks.*; -import org.isoron.uhabits.utils.*; import java.util.*; import javax.inject.*; import static android.graphics.BitmapFactory.*; -import static org.isoron.uhabits.utils.RingtoneUtils.*; +import static org.isoron.uhabits.notifications.RingtoneManager.*; @AppScope -public class NotificationTray - implements CommandRunner.Listener, Preferences.Listener +public class AndroidNotificationTray + implements CommandRunner.Listener, AndroidPreferences.Listener, + NotificationTray { @NonNull private final Context context; @@ -58,17 +62,17 @@ public class NotificationTray private final CommandRunner commandRunner; @NonNull - private final Preferences preferences; + private final AndroidPreferences preferences; @NonNull private final HashMap active; @Inject - public NotificationTray(@AppContext @NonNull Context context, - @NonNull TaskRunner taskRunner, - @NonNull PendingIntentFactory pendingIntents, - @NonNull CommandRunner commandRunner, - @NonNull Preferences preferences) + public AndroidNotificationTray(@AppContext @NonNull Context context, + @NonNull TaskRunner taskRunner, + @NonNull PendingIntentFactory pendingIntents, + @NonNull CommandRunner commandRunner, + @NonNull AndroidPreferences preferences) { this.context = context; this.taskRunner = taskRunner; @@ -78,6 +82,7 @@ public class NotificationTray this.active = new HashMap<>(); } + @Override public void cancel(@NonNull Habit habit) { int notificationId = getNotificationId(habit); diff --git a/app/src/main/java/org/isoron/uhabits/utils/RingtoneUtils.java b/uhabits-android/src/main/java/org/isoron/uhabits/notifications/RingtoneManager.java similarity index 77% rename from app/src/main/java/org/isoron/uhabits/utils/RingtoneUtils.java rename to uhabits-android/src/main/java/org/isoron/uhabits/notifications/RingtoneManager.java index c6a3b4a30..ea4f4ff85 100644 --- a/app/src/main/java/org/isoron/uhabits/utils/RingtoneUtils.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/notifications/RingtoneManager.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. * @@ -17,7 +17,7 @@ * with this program. If not, see . */ -package org.isoron.uhabits.utils; +package org.isoron.uhabits.notifications; import android.content.*; import android.media.*; @@ -25,14 +25,26 @@ import android.net.*; import android.preference.*; import android.provider.*; import android.support.annotation.*; -import android.support.v4.app.*; +import org.isoron.androidbase.*; import org.isoron.uhabits.*; +import org.isoron.uhabits.core.*; + +import javax.inject.*; import static android.media.RingtoneManager.*; -public abstract class RingtoneUtils +@AppScope +public class RingtoneManager { + private Context context; + + @Inject + public RingtoneManager(@AppContext @NonNull Context context) + { + this.context = context; + } + @Nullable public static String getRingtoneName(Context context) { @@ -101,18 +113,4 @@ public abstract class RingtoneUtils } } - public static void startRingtonePickerActivity(Fragment fragment, - int requestCode) - { - Uri existingRingtoneUri = getRingtoneUri(fragment.getContext()); - Uri defaultRingtoneUri = Settings.System.DEFAULT_NOTIFICATION_URI; - - Intent intent = new Intent(ACTION_RINGTONE_PICKER); - intent.putExtra(EXTRA_RINGTONE_TYPE, TYPE_NOTIFICATION); - intent.putExtra(EXTRA_RINGTONE_SHOW_DEFAULT, true); - intent.putExtra(EXTRA_RINGTONE_SHOW_SILENT, true); - intent.putExtra(EXTRA_RINGTONE_DEFAULT_URI, defaultRingtoneUri); - intent.putExtra(EXTRA_RINGTONE_EXISTING_URI, existingRingtoneUri); - fragment.startActivityForResult(intent, requestCode); - } } diff --git a/app/src/main/java/org/isoron/uhabits/package-info.java b/uhabits-android/src/main/java/org/isoron/uhabits/package-info.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/package-info.java rename to uhabits-android/src/main/java/org/isoron/uhabits/package-info.java diff --git a/app/src/main/java/org/isoron/uhabits/preferences/Preferences.java b/uhabits-android/src/main/java/org/isoron/uhabits/preferences/AndroidPreferences.java similarity index 91% rename from app/src/main/java/org/isoron/uhabits/preferences/Preferences.java rename to uhabits-android/src/main/java/org/isoron/uhabits/preferences/AndroidPreferences.java index 878aaa681..4e4641aec 100644 --- a/app/src/main/java/org/isoron/uhabits/preferences/Preferences.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/preferences/AndroidPreferences.java @@ -22,17 +22,20 @@ package org.isoron.uhabits.preferences; import android.content.*; import android.preference.*; +import org.isoron.androidbase.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.activities.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.preferences.*; +import org.isoron.uhabits.core.ui.*; import java.util.*; import javax.inject.*; @AppScope -public class Preferences - implements SharedPreferences.OnSharedPreferenceChangeListener +public class AndroidPreferences + implements SharedPreferences.OnSharedPreferenceChangeListener, Preferences { private final Context context; @@ -43,7 +46,7 @@ public class Preferences private LinkedList listeners; @Inject - public Preferences(@AppContext Context context) + public AndroidPreferences(@AppContext Context context) { this.context = context; listeners = new LinkedList<>(); @@ -77,24 +80,11 @@ public class Preferences } } - public String getSyncAddress() + public void reset() { - 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); + if(!HabitsApplication.isTestMode()) throw new IllegalStateException( + "this method can only be used while testing"); + prefs.edit().clear().commit(); } public void setDefaultOrder(HabitList.Order order) @@ -120,6 +110,7 @@ public class Preferences * * @return number of last hint shown */ + @Override public int getLastHintNumber() { return prefs.getInt("last_hint_number", -1); @@ -130,6 +121,7 @@ public class Preferences * * @return timestamp of the day the last hint was shown */ + @Override public long getLastHintTimestamp() { return prefs.getLong("last_hint_timestamp", -1); @@ -145,21 +137,25 @@ public class Preferences prefs.edit().putLong("last_sync", timestamp).apply(); } + @Override public boolean getShowArchived() { return prefs.getBoolean("pref_show_archived", false); } + @Override public void setShowArchived(boolean showArchived) { prefs.edit().putBoolean("pref_show_archived", showArchived).apply(); } + @Override public boolean getShowCompleted() { return prefs.getBoolean("pref_show_completed", true); } + @Override public void setShowCompleted(boolean showCompleted) { prefs.edit().putBoolean("pref_show_completed", showCompleted).apply(); @@ -170,21 +166,39 @@ 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", ""); } + @Override public int getTheme() { return prefs.getInt("pref_theme", ThemeSwitcher.THEME_LIGHT); } + @Override public void setTheme(int theme) { prefs.edit().putInt("pref_theme", theme).apply(); } + @Override public void incrementLaunchCount() { int count = prefs.getInt("launch_count", 0); @@ -201,16 +215,19 @@ public class Preferences return prefs.getBoolean("pref_developer", false); } + @Override public void setDeveloper(boolean isDeveloper) { prefs.edit().putBoolean("pref_developer", isDeveloper).apply(); } + @Override public boolean isFirstRun() { return prefs.getBoolean("pref_first_run", true); } + @Override public void setFirstRun(boolean isFirstRun) { prefs.edit().putBoolean("pref_first_run", isFirstRun).apply(); @@ -221,6 +238,7 @@ public class Preferences return prefs.getBoolean("pref_feature_numerical_habits", false); } + @Override public boolean isPureBlackEnabled() { return prefs.getBoolean("pref_pure_black", false); @@ -231,6 +249,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) @@ -293,6 +316,7 @@ public class Preferences * @param number number of the last hint shown * @param timestamp timestamp for the day the last hint was shown */ + @Override public void updateLastHint(int number, long timestamp) { prefs diff --git a/app/src/main/java/org/isoron/uhabits/preferences/WidgetPreferences.java b/uhabits-android/src/main/java/org/isoron/uhabits/preferences/WidgetPreferences.java similarity index 94% rename from app/src/main/java/org/isoron/uhabits/preferences/WidgetPreferences.java rename to uhabits-android/src/main/java/org/isoron/uhabits/preferences/WidgetPreferences.java index 56566f639..20e9b32e5 100644 --- a/app/src/main/java/org/isoron/uhabits/preferences/WidgetPreferences.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/preferences/WidgetPreferences.java @@ -22,8 +22,9 @@ package org.isoron.uhabits.preferences; import android.content.*; import android.preference.*; -import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.androidbase.*; +import org.isoron.uhabits.core.*; +import org.isoron.uhabits.core.models.*; import javax.inject.*; diff --git a/app/src/main/java/org/isoron/uhabits/receivers/ConnectivityReceiver.java b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ConnectivityReceiver.java similarity index 97% rename from app/src/main/java/org/isoron/uhabits/receivers/ConnectivityReceiver.java rename to uhabits-android/src/main/java/org/isoron/uhabits/receivers/ConnectivityReceiver.java index a61913a6b..39e9b2fd3 100644 --- a/app/src/main/java/org/isoron/uhabits/receivers/ConnectivityReceiver.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ConnectivityReceiver.java @@ -36,7 +36,7 @@ public class ConnectivityReceiver extends BroadcastReceiver if (context == null) return; if (intent == null) return; - AppComponent component = + HabitsComponent component = ((HabitsApplication) context.getApplicationContext()).getComponent(); NetworkInfo networkInfo = diff --git a/app/src/main/java/org/isoron/uhabits/receivers/PebbleReceiver.java b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/PebbleReceiver.java similarity index 95% rename from app/src/main/java/org/isoron/uhabits/receivers/PebbleReceiver.java rename to uhabits-android/src/main/java/org/isoron/uhabits/receivers/PebbleReceiver.java index 4d10d7ae5..85d3140e6 100644 --- a/app/src/main/java/org/isoron/uhabits/receivers/PebbleReceiver.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/PebbleReceiver.java @@ -28,12 +28,12 @@ import com.getpebble.android.kit.PebbleKit.*; import com.getpebble.android.kit.util.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.commands.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.commands.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.preferences.*; import org.isoron.uhabits.sync.*; -import org.isoron.uhabits.tasks.*; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.tasks.*; +import org.isoron.uhabits.core.utils.*; import java.util.*; @@ -53,7 +53,7 @@ public class PebbleReceiver extends PebbleDataReceiver private HabitList filteredHabits; - private Preferences prefs; + private AndroidPreferences prefs; public PebbleReceiver() { @@ -73,7 +73,7 @@ public class PebbleReceiver extends PebbleDataReceiver HabitsApplication app = (HabitsApplication) context.getApplicationContext(); - AppComponent component = app.getComponent(); + HabitsComponent component = app.getComponent(); commandRunner = component.getCommandRunner(); taskRunner = component.getTaskRunner(); allHabits = component.getHabitList(); diff --git a/app/src/main/java/org/isoron/uhabits/receivers/ReceiverScope.java b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReceiverScope.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/receivers/ReceiverScope.java rename to uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReceiverScope.java diff --git a/app/src/main/java/org/isoron/uhabits/receivers/ReminderController.java b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderController.java similarity index 83% rename from app/src/main/java/org/isoron/uhabits/receivers/ReminderController.java rename to uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderController.java index 22fd4bcd0..897972206 100644 --- a/app/src/main/java/org/isoron/uhabits/receivers/ReminderController.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderController.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,8 +21,9 @@ package org.isoron.uhabits.receivers; import android.support.annotation.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.notifications.*; +import org.isoron.uhabits.core.utils.*; import org.isoron.uhabits.preferences.*; import org.isoron.uhabits.utils.*; @@ -35,14 +36,14 @@ public class ReminderController private final ReminderScheduler reminderScheduler; @NonNull - private final NotificationTray notificationTray; + private final AndroidNotificationTray notificationTray; - private Preferences preferences; + private AndroidPreferences preferences; @Inject public ReminderController(@NonNull ReminderScheduler reminderScheduler, - @NonNull NotificationTray notificationTray, - @NonNull Preferences preferences) + @NonNull AndroidNotificationTray notificationTray, + @NonNull AndroidPreferences preferences) { this.reminderScheduler = reminderScheduler; this.notificationTray = notificationTray; diff --git a/app/src/main/java/org/isoron/uhabits/receivers/ReminderReceiver.java b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderReceiver.java similarity index 94% rename from app/src/main/java/org/isoron/uhabits/receivers/ReminderReceiver.java rename to uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderReceiver.java index c8d022f61..e6187feaf 100644 --- a/app/src/main/java/org/isoron/uhabits/receivers/ReminderReceiver.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/ReminderReceiver.java @@ -23,8 +23,8 @@ import android.content.*; import android.util.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.utils.*; import dagger.*; @@ -56,7 +56,7 @@ public class ReminderReceiver extends BroadcastReceiver ReminderComponent component = DaggerReminderReceiver_ReminderComponent .builder() - .appComponent(app.getComponent()) + .habitsComponent(app.getComponent()) .build(); HabitList habits = app.getComponent().getHabitList(); @@ -105,7 +105,7 @@ public class ReminderReceiver extends BroadcastReceiver } @ReceiverScope - @Component(dependencies = AppComponent.class) + @Component(dependencies = HabitsComponent.class) interface ReminderComponent { ReminderController getReminderController(); diff --git a/app/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java similarity index 90% rename from app/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java rename to uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java index e8dd70729..de5ebbcc2 100644 --- a/app/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/receivers/WidgetReceiver.java @@ -26,6 +26,7 @@ import org.isoron.uhabits.*; import org.isoron.uhabits.intents.*; import org.isoron.uhabits.preferences.*; import org.isoron.uhabits.sync.*; +import org.isoron.uhabits.core.ui.widgets.*; import dagger.*; @@ -56,12 +57,12 @@ public class WidgetReceiver extends BroadcastReceiver WidgetComponent component = DaggerWidgetReceiver_WidgetComponent .builder() - .appComponent(app.getComponent()) + .habitsComponent(app.getComponent()) .build(); IntentParser parser = app.getComponent().getIntentParser(); - WidgetController controller = component.getWidgetController(); - Preferences prefs = app.getComponent().getPreferences(); + WidgetBehavior controller = component.getWidgetController(); + AndroidPreferences prefs = app.getComponent().getPreferences(); if(prefs.isSyncFeatureEnabled()) context.startService(new Intent(context, SyncService.class)); @@ -93,9 +94,9 @@ public class WidgetReceiver extends BroadcastReceiver } @ReceiverScope - @Component(dependencies = AppComponent.class) + @Component(dependencies = HabitsComponent.class) interface WidgetComponent { - WidgetController getWidgetController(); + WidgetBehavior getWidgetController(); } } diff --git a/app/src/main/java/org/isoron/uhabits/sync/Event.java b/uhabits-android/src/main/java/org/isoron/uhabits/sync/Event.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/sync/Event.java rename to uhabits-android/src/main/java/org/isoron/uhabits/sync/Event.java diff --git a/app/src/main/java/org/isoron/uhabits/sync/SyncManager.java b/uhabits-android/src/main/java/org/isoron/uhabits/sync/SyncManager.java similarity index 92% rename from app/src/main/java/org/isoron/uhabits/sync/SyncManager.java rename to uhabits-android/src/main/java/org/isoron/uhabits/sync/SyncManager.java index ebfee4be8..66cfc8c62 100644 --- a/app/src/main/java/org/isoron/uhabits/sync/SyncManager.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/sync/SyncManager.java @@ -19,14 +19,14 @@ package org.isoron.uhabits.sync; -import android.content.*; import android.support.annotation.*; import android.util.*; +import org.isoron.androidbase.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.commands.*; +import org.isoron.uhabits.core.*; +import org.isoron.uhabits.core.commands.*; import org.isoron.uhabits.preferences.*; -import org.isoron.uhabits.utils.*; import org.json.*; import java.net.*; @@ -73,7 +73,7 @@ public class SyncManager implements CommandRunner.Listener private boolean readyToEmit = false; @NonNull - private final Preferences prefs; + private final AndroidPreferences prefs; @NonNull private CommandRunner commandRunner; @@ -83,12 +83,15 @@ public class SyncManager implements CommandRunner.Listener private boolean isListening; + private BaseSystem system; + @Inject - public SyncManager(@AppContext @NonNull Context context, - @NonNull Preferences prefs, + public SyncManager(@NonNull BaseSystem system, + @NonNull AndroidPreferences prefs, @NonNull CommandRunner commandRunner, @NonNull CommandParser commandParser) { + this.system = system; Log.i("SyncManager", this.toString()); this.prefs = prefs; @@ -104,7 +107,19 @@ public class SyncManager implements CommandRunner.Listener String serverURL = prefs.getSyncAddress(); Log.d("SyncManager", clientId); - connect(context, serverURL); + connect(serverURL); + } + + private JSONObject toJSONObject(String json) + { + try + { + return new JSONObject(json); + } + catch (JSONException e) + { + throw new RuntimeException(e); + } } @Override @@ -113,7 +128,7 @@ public class SyncManager implements CommandRunner.Listener { if (command.isRemote()) return; - JSONObject msg = command.toJson(); + JSONObject msg = toJSONObject(command.toJson()); Long now = new Date().getTime(); Event e = new Event(command.getId(), now, msg.toString()); e.save(); @@ -151,11 +166,11 @@ public class SyncManager implements CommandRunner.Listener isListening = false; } - private void connect(@AppContext @NonNull Context context, String serverURL) + private void connect(String serverURL) { try { - IO.setDefaultSSLContext(SSLUtils.getCACertSSLContext(context)); + IO.setDefaultSSLContext(system.getCACertSSLContext()); socket = IO.socket(serverURL); logSocketEvent(socket, EVENT_CONNECT, "Connected"); @@ -303,7 +318,7 @@ public class SyncManager implements CommandRunner.Listener private void executeCommand(JSONObject root) throws JSONException { - Command received = commandParser.parse(root); + Command received = commandParser.parse(root.toString()); received.setRemote(true); for (Event e : pendingConfirmation) diff --git a/app/src/main/java/org/isoron/uhabits/sync/SyncService.java b/uhabits-android/src/main/java/org/isoron/uhabits/sync/SyncService.java similarity index 95% rename from app/src/main/java/org/isoron/uhabits/sync/SyncService.java rename to uhabits-android/src/main/java/org/isoron/uhabits/sync/SyncService.java index 3f8d59590..e1af21506 100644 --- a/app/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/app/src/main/java/org/isoron/uhabits/tasks/AndroidTaskRunner.java b/uhabits-android/src/main/java/org/isoron/uhabits/tasks/AndroidTaskRunner.java similarity index 95% rename from app/src/main/java/org/isoron/uhabits/tasks/AndroidTaskRunner.java rename to uhabits-android/src/main/java/org/isoron/uhabits/tasks/AndroidTaskRunner.java index e1626fe34..7b60834ba 100644 --- a/app/src/main/java/org/isoron/uhabits/tasks/AndroidTaskRunner.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/tasks/AndroidTaskRunner.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,7 +21,8 @@ package org.isoron.uhabits.tasks; import android.os.*; -import org.isoron.uhabits.*; +import org.isoron.uhabits.core.*; +import org.isoron.uhabits.core.tasks.*; import java.util.*; diff --git a/app/src/main/java/org/isoron/uhabits/tasks/ExportDBTask.java b/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ExportDBTask.java similarity index 79% rename from app/src/main/java/org/isoron/uhabits/tasks/ExportDBTask.java rename to uhabits-android/src/main/java/org/isoron/uhabits/tasks/ExportDBTask.java index 26f523194..013027925 100644 --- a/app/src/main/java/org/isoron/uhabits/tasks/ExportDBTask.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ExportDBTask.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,14 +19,13 @@ package org.isoron.uhabits.tasks; -import android.content.Context; +import android.content.*; import android.support.annotation.*; -import com.google.auto.factory.AutoFactory; -import com.google.auto.factory.Provided; +import com.google.auto.factory.*; -import org.isoron.uhabits.AppContext; -import org.isoron.uhabits.activities.ActivityContext; +import org.isoron.androidbase.*; +import org.isoron.uhabits.core.tasks.*; import org.isoron.uhabits.utils.*; import java.io.*; @@ -39,11 +38,16 @@ public class ExportDBTask implements Task @NonNull private Context context; + private BaseSystem system; + @NonNull private final Listener listener; - public ExportDBTask(@Provided @AppContext @NonNull Context context, @NonNull Listener listener) + public ExportDBTask(@Provided @AppContext @NonNull Context context, + @Provided @NonNull BaseSystem system, + @NonNull Listener listener) { + this.system = system; this.listener = listener; this.context = context; } @@ -55,7 +59,7 @@ public class ExportDBTask implements Task try { - File dir = FileUtils.getFilesDir(context, "Backups"); + File dir = system.getFilesDir("Backups"); if (dir == null) return; filename = DatabaseUtils.saveDatabaseCopy(context, dir); diff --git a/app/src/main/java/org/isoron/uhabits/tasks/ImportDataTask.java b/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ImportDataTask.java similarity index 95% rename from app/src/main/java/org/isoron/uhabits/tasks/ImportDataTask.java rename to uhabits-android/src/main/java/org/isoron/uhabits/tasks/ImportDataTask.java index e19e7b8fc..a23343a2c 100644 --- a/app/src/main/java/org/isoron/uhabits/tasks/ImportDataTask.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/tasks/ImportDataTask.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. * @@ -23,6 +23,7 @@ import android.support.annotation.*; import com.google.auto.factory.*; +import org.isoron.uhabits.core.tasks.*; import org.isoron.uhabits.io.*; import java.io.*; diff --git a/app/src/main/java/org/isoron/uhabits/tasks/package-info.java b/uhabits-android/src/main/java/org/isoron/uhabits/tasks/package-info.java similarity index 84% rename from app/src/main/java/org/isoron/uhabits/tasks/package-info.java rename to uhabits-android/src/main/java/org/isoron/uhabits/tasks/package-info.java index cc837895e..5a175d814 100644 --- a/app/src/main/java/org/isoron/uhabits/tasks/package-info.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/tasks/package-info.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,6 @@ /** * Provides async tasks for useful operations such as {@link - * org.isoron.uhabits.tasks.ExportCSVTask}. + * org.isoron.uhabits.core.tasks.ExportCSVTask}. */ package org.isoron.uhabits.tasks; \ No newline at end of file diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/utils/AndroidDateFormats.java b/uhabits-android/src/main/java/org/isoron/uhabits/utils/AndroidDateFormats.java new file mode 100644 index 000000000..81e72b3b0 --- /dev/null +++ b/uhabits-android/src/main/java/org/isoron/uhabits/utils/AndroidDateFormats.java @@ -0,0 +1,39 @@ +/* + * 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.utils; + +import android.support.annotation.*; + +import org.isoron.uhabits.core.utils.*; + +import java.text.*; +import java.util.*; + +import static android.text.format.DateFormat.getBestDateTimePattern; + +public class AndroidDateFormats +{ + @NonNull + public static SimpleDateFormat fromSkeleton(@NonNull String skeleton) + { + Locale locale = Locale.getDefault(); + skeleton = getBestDateTimePattern(locale, skeleton); + return DateFormats.fromSkeleton(skeleton, locale); + } +} diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/utils/AndroidDateUtils.java b/uhabits-android/src/main/java/org/isoron/uhabits/utils/AndroidDateUtils.java new file mode 100644 index 000000000..2300d2249 --- /dev/null +++ b/uhabits-android/src/main/java/org/isoron/uhabits/utils/AndroidDateUtils.java @@ -0,0 +1,74 @@ +/* + * 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.utils; + +import android.content.*; +import android.text.format.*; +import android.text.format.DateUtils; + +import org.isoron.uhabits.*; +import org.isoron.uhabits.core.utils.*; + +import java.util.*; + +public class AndroidDateUtils +{ + public static String formatTime(Context context, int hours, int minutes) + { + int reminderMilliseconds = (hours * 60 + minutes) * 60 * 1000; + + Date date = new Date(reminderMilliseconds); + java.text.DateFormat df = DateFormat.getTimeFormat(context); + df.setTimeZone(TimeZone.getTimeZone("UTC")); + + return df.format(date); + } + + public static String formatWeekdayList(Context context, boolean weekday[]) + { + String shortDayNames[] = org.isoron.uhabits.core.utils.DateUtils.getShortDayNames(); + String longDayNames[] = org.isoron.uhabits.core.utils.DateUtils.getLongDayNames(); + StringBuilder buffer = new StringBuilder(); + + int count = 0; + int first = 0; + boolean isFirst = true; + for (int i = 0; i < 7; i++) + { + if (weekday[i]) + { + if (isFirst) first = i; + else buffer.append(", "); + + buffer.append(shortDayNames[i]); + isFirst = false; + count++; + } + } + + if (count == 1) return longDayNames[first]; + if (count == 2 && weekday[0] && weekday[1]) + return context.getString(R.string.weekends); + if (count == 5 && !weekday[0] && !weekday[1]) + return context.getString(R.string.any_weekday); + if (count == 7) return context.getString(R.string.any_day); + return buffer.toString(); + } +} diff --git a/app/src/main/java/org/isoron/uhabits/utils/AttributeSetUtils.java b/uhabits-android/src/main/java/org/isoron/uhabits/utils/AttributeSetUtils.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/utils/AttributeSetUtils.java rename to uhabits-android/src/main/java/org/isoron/uhabits/utils/AttributeSetUtils.java diff --git a/app/src/main/java/org/isoron/uhabits/utils/ColorUtils.java b/uhabits-android/src/main/java/org/isoron/uhabits/utils/ColorUtils.java similarity index 89% rename from app/src/main/java/org/isoron/uhabits/utils/ColorUtils.java rename to uhabits-android/src/main/java/org/isoron/uhabits/utils/ColorUtils.java index 25434bacc..16845892f 100644 --- a/app/src/main/java/org/isoron/uhabits/utils/ColorUtils.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/utils/ColorUtils.java @@ -25,22 +25,6 @@ import android.util.*; public abstract class ColorUtils { - public static String CSV_PALETTE[] = { - "#D32F2F", // 0 red - "#E64A19", // 1 orange - "#F9A825", // 2 yellow - "#AFB42B", // 3 light green - "#388E3C", // 4 dark green - "#00897B", // 5 teal - "#00ACC1", // 6 cyan - "#039BE5", // 7 blue - "#5E35B1", // 8 deep purple - "#8E24AA", // 9 purple - "#D81B60", // 10 pink - "#303030", // 11 dark grey - "#aaaaaa" // 12 light grey - }; - public static int colorToPaletteIndex(Context context, int color) { StyledResources res = new StyledResources(context); diff --git a/app/src/main/java/org/isoron/uhabits/utils/DatabaseUtils.java b/uhabits-android/src/main/java/org/isoron/uhabits/utils/DatabaseUtils.java similarity index 95% rename from app/src/main/java/org/isoron/uhabits/utils/DatabaseUtils.java rename to uhabits-android/src/main/java/org/isoron/uhabits/utils/DatabaseUtils.java index 146842e2c..1e03f4f95 100644 --- a/app/src/main/java/org/isoron/uhabits/utils/DatabaseUtils.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/utils/DatabaseUtils.java @@ -24,15 +24,15 @@ import android.support.annotation.*; import com.activeandroid.*; +import org.isoron.androidbase.utils.*; import org.isoron.uhabits.*; +import org.isoron.uhabits.core.utils.*; import org.isoron.uhabits.models.sqlite.*; import org.isoron.uhabits.models.sqlite.records.*; import org.isoron.uhabits.sync.*; import java.io.*; -import java.math.*; import java.text.*; -import java.util.*; public abstract class DatabaseUtils { @@ -70,11 +70,6 @@ public abstract class DatabaseUtils return databaseFilename; } - public static String getRandomId() - { - return new BigInteger(260, new Random()).toString(32).substring(0, 32); - } - @SuppressWarnings("unchecked") public static void initializeActiveAndroid(Context context) { diff --git a/app/src/main/java/org/isoron/uhabits/utils/InterfaceUtils.java b/uhabits-android/src/main/java/org/isoron/uhabits/utils/InterfaceUtils.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/utils/InterfaceUtils.java rename to uhabits-android/src/main/java/org/isoron/uhabits/utils/InterfaceUtils.java diff --git a/app/src/main/java/org/isoron/uhabits/utils/ReminderScheduler.java b/uhabits-android/src/main/java/org/isoron/uhabits/utils/ReminderScheduler.java similarity index 94% rename from app/src/main/java/org/isoron/uhabits/utils/ReminderScheduler.java rename to uhabits-android/src/main/java/org/isoron/uhabits/utils/ReminderScheduler.java index e0d02e85b..914c8a8f6 100644 --- a/app/src/main/java/org/isoron/uhabits/utils/ReminderScheduler.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/utils/ReminderScheduler.java @@ -23,15 +23,17 @@ import android.app.*; import android.support.annotation.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.commands.*; +import org.isoron.uhabits.core.*; +import org.isoron.uhabits.core.commands.*; +import org.isoron.uhabits.core.utils.*; import org.isoron.uhabits.intents.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import java.util.*; import javax.inject.*; -import static org.isoron.uhabits.utils.DateUtils.*; +import static org.isoron.uhabits.core.utils.DateUtils.*; @AppScope public class ReminderScheduler implements CommandRunner.Listener diff --git a/app/src/main/java/org/isoron/uhabits/utils/StyledResources.java b/uhabits-android/src/main/java/org/isoron/uhabits/utils/StyledResources.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/utils/StyledResources.java rename to uhabits-android/src/main/java/org/isoron/uhabits/utils/StyledResources.java diff --git a/app/src/main/java/org/isoron/uhabits/utils/package-info.java b/uhabits-android/src/main/java/org/isoron/uhabits/utils/package-info.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/utils/package-info.java rename to uhabits-android/src/main/java/org/isoron/uhabits/utils/package-info.java diff --git a/app/src/main/java/org/isoron/uhabits/widgets/BaseWidget.java b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/BaseWidget.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/widgets/BaseWidget.java rename to uhabits-android/src/main/java/org/isoron/uhabits/widgets/BaseWidget.java diff --git a/app/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java similarity index 77% rename from app/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java rename to uhabits-android/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java index 74dc1fe2c..75a62f66d 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java @@ -28,10 +28,11 @@ import android.widget.*; import com.activeandroid.util.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.preferences.*; -import static org.isoron.uhabits.utils.WidgetUtils.*; +import static android.appwidget.AppWidgetManager.*; +import static org.isoron.uhabits.utils.InterfaceUtils.*; public abstract class BaseWidgetProvider extends AppWidgetProvider { @@ -39,6 +40,31 @@ public abstract class BaseWidgetProvider extends AppWidgetProvider private WidgetPreferences widgetPrefs; + public static void updateAppWidget(@NonNull AppWidgetManager manager, + @NonNull BaseWidget widget) + { + RemoteViews landscape = widget.getLandscapeRemoteViews(); + RemoteViews portrait = widget.getPortraitRemoteViews(); + RemoteViews views = new RemoteViews(landscape, portrait); + manager.updateAppWidget(widget.getId(), views); + } + + @NonNull + public WidgetDimensions getDimensionsFromOptions(@NonNull Context ctx, + @NonNull Bundle options) + { + int maxWidth = + (int) dpToPixels(ctx, options.getInt(OPTION_APPWIDGET_MAX_WIDTH)); + int maxHeight = + (int) dpToPixels(ctx, options.getInt(OPTION_APPWIDGET_MAX_HEIGHT)); + int minWidth = + (int) dpToPixels(ctx, options.getInt(OPTION_APPWIDGET_MIN_WIDTH)); + int minHeight = + (int) dpToPixels(ctx, options.getInt(OPTION_APPWIDGET_MIN_HEIGHT)); + + return new WidgetDimensions(minWidth, maxHeight, maxWidth, minHeight); + } + @Override public void onAppWidgetOptionsChanged(@Nullable Context context, @Nullable AppWidgetManager manager, @@ -100,7 +126,8 @@ public abstract class BaseWidgetProvider extends AppWidgetProvider updateDependencies(context); - new Thread(() -> { + new Thread(() -> + { Looper.prepare(); for (int id : widgetIds) update(context, manager, id); @@ -128,8 +155,10 @@ public abstract class BaseWidgetProvider extends AppWidgetProvider RemoteViews errorView = new RemoteViews(context.getPackageName(), R.layout.widget_error); - if(e instanceof HabitNotFoundException) { - errorView.setCharSequence(R.id.label, "setText", context.getString(R.string.habit_not_found)); + if (e instanceof HabitNotFoundException) + { + errorView.setCharSequence(R.id.label, "setText", + context.getString(R.string.habit_not_found)); } manager.updateAppWidget(widgetId, errorView); @@ -143,8 +172,7 @@ public abstract class BaseWidgetProvider extends AppWidgetProvider { BaseWidget widget = getWidgetFromId(context, widgetId); Bundle options = manager.getAppWidgetOptions(widgetId); - widget.setDimensions( - getDimensionsFromOptions(context, options)); + widget.setDimensions(getDimensionsFromOptions(context, options)); updateAppWidget(manager, widget); } diff --git a/app/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidget.java b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidget.java similarity index 98% rename from app/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidget.java rename to uhabits-android/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidget.java index aa57e7371..4eb6fd69a 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidget.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidget.java @@ -24,7 +24,7 @@ import android.content.*; import android.support.annotation.*; import android.view.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.utils.*; import org.isoron.uhabits.widgets.views.*; diff --git a/app/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidgetProvider.java b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidgetProvider.java similarity index 96% rename from app/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidgetProvider.java rename to uhabits-android/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidgetProvider.java index cd3fe8e62..3b798bd72 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidgetProvider.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidgetProvider.java @@ -21,7 +21,7 @@ package org.isoron.uhabits.widgets; import android.content.*; import android.support.annotation.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; public class CheckmarkWidgetProvider extends BaseWidgetProvider { diff --git a/app/src/main/java/org/isoron/uhabits/widgets/FrequencyWidget.java b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/FrequencyWidget.java similarity index 98% rename from app/src/main/java/org/isoron/uhabits/widgets/FrequencyWidget.java rename to uhabits-android/src/main/java/org/isoron/uhabits/widgets/FrequencyWidget.java index ff76fdac4..ea4e3d889 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/FrequencyWidget.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/FrequencyWidget.java @@ -25,7 +25,7 @@ import android.support.annotation.*; import android.view.*; import org.isoron.uhabits.activities.common.views.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.utils.*; import org.isoron.uhabits.widgets.views.*; diff --git a/app/src/main/java/org/isoron/uhabits/widgets/FrequencyWidgetProvider.java b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/FrequencyWidgetProvider.java similarity index 96% rename from app/src/main/java/org/isoron/uhabits/widgets/FrequencyWidgetProvider.java rename to uhabits-android/src/main/java/org/isoron/uhabits/widgets/FrequencyWidgetProvider.java index 2d3e5fce9..423cf6ebc 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/FrequencyWidgetProvider.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/FrequencyWidgetProvider.java @@ -22,7 +22,7 @@ package org.isoron.uhabits.widgets; import android.content.*; import android.support.annotation.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; public class FrequencyWidgetProvider extends BaseWidgetProvider { diff --git a/app/src/main/java/org/isoron/uhabits/widgets/HabitPickerDialog.java b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/HabitPickerDialog.java similarity index 96% rename from app/src/main/java/org/isoron/uhabits/widgets/HabitPickerDialog.java rename to uhabits-android/src/main/java/org/isoron/uhabits/widgets/HabitPickerDialog.java index e648db7e6..f6f586c4b 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/HabitPickerDialog.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/HabitPickerDialog.java @@ -26,7 +26,7 @@ import android.view.*; import android.widget.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.preferences.*; import java.util.*; @@ -69,7 +69,7 @@ public class HabitPickerDialog extends Activity setContentView(R.layout.widget_configure_activity); HabitsApplication app = (HabitsApplication) getApplicationContext(); - AppComponent component = app.getComponent(); + HabitsComponent component = app.getComponent(); habitList = component.getHabitList(); preferences = component.getWidgetPreferences(); diff --git a/app/src/main/java/org/isoron/uhabits/widgets/HistoryWidget.java b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/HistoryWidget.java similarity index 98% rename from app/src/main/java/org/isoron/uhabits/widgets/HistoryWidget.java rename to uhabits-android/src/main/java/org/isoron/uhabits/widgets/HistoryWidget.java index 0553e35ff..3035aec77 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/HistoryWidget.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/HistoryWidget.java @@ -25,7 +25,7 @@ import android.support.annotation.*; import android.view.*; import org.isoron.uhabits.activities.common.views.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.utils.*; import org.isoron.uhabits.widgets.views.*; diff --git a/app/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.java b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.java similarity index 96% rename from app/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.java rename to uhabits-android/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.java index 6f377ca3a..4fad4b853 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/HistoryWidgetProvider.java @@ -21,7 +21,7 @@ package org.isoron.uhabits.widgets; import android.content.*; import android.support.annotation.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; public class HistoryWidgetProvider extends BaseWidgetProvider { diff --git a/app/src/main/java/org/isoron/uhabits/widgets/ScoreWidget.java b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/ScoreWidget.java similarity index 97% rename from app/src/main/java/org/isoron/uhabits/widgets/ScoreWidget.java rename to uhabits-android/src/main/java/org/isoron/uhabits/widgets/ScoreWidget.java index 7ff8cf1fe..1fcb02721 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/ScoreWidget.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/ScoreWidget.java @@ -27,7 +27,7 @@ import android.view.*; import org.isoron.uhabits.*; import org.isoron.uhabits.activities.common.views.*; import org.isoron.uhabits.activities.habits.show.views.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.preferences.*; import org.isoron.uhabits.utils.*; import org.isoron.uhabits.widgets.views.*; @@ -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/app/src/main/java/org/isoron/uhabits/widgets/ScoreWidgetProvider.java b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/ScoreWidgetProvider.java similarity index 96% rename from app/src/main/java/org/isoron/uhabits/widgets/ScoreWidgetProvider.java rename to uhabits-android/src/main/java/org/isoron/uhabits/widgets/ScoreWidgetProvider.java index 002be7f17..1ad3fb80b 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/ScoreWidgetProvider.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/ScoreWidgetProvider.java @@ -21,7 +21,7 @@ package org.isoron.uhabits.widgets; import android.content.*; import android.support.annotation.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; public class ScoreWidgetProvider extends BaseWidgetProvider { diff --git a/app/src/main/java/org/isoron/uhabits/widgets/StreakWidget.java b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/StreakWidget.java similarity index 98% rename from app/src/main/java/org/isoron/uhabits/widgets/StreakWidget.java rename to uhabits-android/src/main/java/org/isoron/uhabits/widgets/StreakWidget.java index ecf3fe957..781ee71f4 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/StreakWidget.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/StreakWidget.java @@ -26,7 +26,7 @@ import android.view.*; import android.view.ViewGroup.*; import org.isoron.uhabits.activities.common.views.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.utils.*; import org.isoron.uhabits.widgets.views.*; diff --git a/app/src/main/java/org/isoron/uhabits/widgets/StreakWidgetProvider.java b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/StreakWidgetProvider.java similarity index 96% rename from app/src/main/java/org/isoron/uhabits/widgets/StreakWidgetProvider.java rename to uhabits-android/src/main/java/org/isoron/uhabits/widgets/StreakWidgetProvider.java index 211246eb3..a097f7bb6 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/StreakWidgetProvider.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/StreakWidgetProvider.java @@ -21,7 +21,7 @@ package org.isoron.uhabits.widgets; import android.content.*; import android.support.annotation.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; public class StreakWidgetProvider extends BaseWidgetProvider { diff --git a/app/src/main/java/org/isoron/uhabits/widgets/WidgetDimensions.java b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/WidgetDimensions.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/widgets/WidgetDimensions.java rename to uhabits-android/src/main/java/org/isoron/uhabits/widgets/WidgetDimensions.java diff --git a/app/src/main/java/org/isoron/uhabits/widgets/WidgetUpdater.java b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/WidgetUpdater.java similarity index 96% rename from app/src/main/java/org/isoron/uhabits/widgets/WidgetUpdater.java rename to uhabits-android/src/main/java/org/isoron/uhabits/widgets/WidgetUpdater.java index 72f3e441a..a10014212 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/WidgetUpdater.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/WidgetUpdater.java @@ -23,9 +23,9 @@ import android.appwidget.*; import android.content.*; import android.support.annotation.*; -import org.isoron.uhabits.*; -import org.isoron.uhabits.commands.*; -import org.isoron.uhabits.tasks.*; +import org.isoron.androidbase.*; +import org.isoron.uhabits.core.commands.*; +import org.isoron.uhabits.core.tasks.*; import javax.inject.*; diff --git a/app/src/main/java/org/isoron/uhabits/widgets/package-info.java b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/package-info.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/widgets/package-info.java rename to uhabits-android/src/main/java/org/isoron/uhabits/widgets/package-info.java diff --git a/app/src/main/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetView.java b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetView.java similarity index 99% rename from app/src/main/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetView.java rename to uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetView.java index 2bddef022..00afeb46b 100644 --- a/app/src/main/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetView.java +++ b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetView.java @@ -25,7 +25,7 @@ import android.util.*; import android.widget.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.activities.common.views.*; import org.isoron.uhabits.utils.*; diff --git a/app/src/main/java/org/isoron/uhabits/widgets/views/GraphWidgetView.java b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/GraphWidgetView.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/widgets/views/GraphWidgetView.java rename to uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/GraphWidgetView.java diff --git a/app/src/main/java/org/isoron/uhabits/widgets/views/HabitWidgetView.java b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/HabitWidgetView.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/widgets/views/HabitWidgetView.java rename to uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/HabitWidgetView.java diff --git a/app/src/main/java/org/isoron/uhabits/widgets/views/package-info.java b/uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/package-info.java similarity index 100% rename from app/src/main/java/org/isoron/uhabits/widgets/views/package-info.java rename to uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/package-info.java diff --git a/app/src/main/res/color/date_picker_selector.xml b/uhabits-android/src/main/res/color/date_picker_selector.xml similarity index 100% rename from app/src/main/res/color/date_picker_selector.xml rename to uhabits-android/src/main/res/color/date_picker_selector.xml diff --git a/app/src/main/res/color/date_picker_year_selector.xml b/uhabits-android/src/main/res/color/date_picker_year_selector.xml similarity index 100% rename from app/src/main/res/color/date_picker_year_selector.xml rename to uhabits-android/src/main/res/color/date_picker_year_selector.xml diff --git a/app/src/main/res/drawable-hdpi/ic_action_add_dark.png b/uhabits-android/src/main/res/drawable-hdpi/ic_action_add_dark.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_action_add_dark.png rename to uhabits-android/src/main/res/drawable-hdpi/ic_action_add_dark.png diff --git a/app/src/main/res/drawable-hdpi/ic_action_add_light.png b/uhabits-android/src/main/res/drawable-hdpi/ic_action_add_light.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_action_add_light.png rename to uhabits-android/src/main/res/drawable-hdpi/ic_action_add_light.png diff --git a/app/src/main/res/drawable-hdpi/ic_action_archive_dark.png b/uhabits-android/src/main/res/drawable-hdpi/ic_action_archive_dark.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_action_archive_dark.png rename to uhabits-android/src/main/res/drawable-hdpi/ic_action_archive_dark.png diff --git a/app/src/main/res/drawable-hdpi/ic_action_archive_light.png b/uhabits-android/src/main/res/drawable-hdpi/ic_action_archive_light.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_action_archive_light.png rename to uhabits-android/src/main/res/drawable-hdpi/ic_action_archive_light.png diff --git a/app/src/main/res/drawable-hdpi/ic_action_check.png b/uhabits-android/src/main/res/drawable-hdpi/ic_action_check.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_action_check.png rename to uhabits-android/src/main/res/drawable-hdpi/ic_action_check.png diff --git a/app/src/main/res/drawable-hdpi/ic_action_color_dark.png b/uhabits-android/src/main/res/drawable-hdpi/ic_action_color_dark.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_action_color_dark.png rename to uhabits-android/src/main/res/drawable-hdpi/ic_action_color_dark.png diff --git a/app/src/main/res/drawable-hdpi/ic_action_color_light.png b/uhabits-android/src/main/res/drawable-hdpi/ic_action_color_light.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_action_color_light.png rename to uhabits-android/src/main/res/drawable-hdpi/ic_action_color_light.png diff --git a/app/src/main/res/drawable-hdpi/ic_action_download_dark.png b/uhabits-android/src/main/res/drawable-hdpi/ic_action_download_dark.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_action_download_dark.png rename to uhabits-android/src/main/res/drawable-hdpi/ic_action_download_dark.png diff --git a/app/src/main/res/drawable-hdpi/ic_action_download_light.png b/uhabits-android/src/main/res/drawable-hdpi/ic_action_download_light.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_action_download_light.png rename to uhabits-android/src/main/res/drawable-hdpi/ic_action_download_light.png diff --git a/app/src/main/res/drawable-hdpi/ic_action_edit_dark.png b/uhabits-android/src/main/res/drawable-hdpi/ic_action_edit_dark.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_action_edit_dark.png rename to uhabits-android/src/main/res/drawable-hdpi/ic_action_edit_dark.png diff --git a/app/src/main/res/drawable-hdpi/ic_action_edit_light.png b/uhabits-android/src/main/res/drawable-hdpi/ic_action_edit_light.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_action_edit_light.png rename to uhabits-android/src/main/res/drawable-hdpi/ic_action_edit_light.png diff --git a/app/src/main/res/drawable-hdpi/ic_action_filter_dark.png b/uhabits-android/src/main/res/drawable-hdpi/ic_action_filter_dark.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_action_filter_dark.png rename to uhabits-android/src/main/res/drawable-hdpi/ic_action_filter_dark.png diff --git a/app/src/main/res/drawable-hdpi/ic_action_filter_light.png b/uhabits-android/src/main/res/drawable-hdpi/ic_action_filter_light.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_action_filter_light.png rename to uhabits-android/src/main/res/drawable-hdpi/ic_action_filter_light.png diff --git a/app/src/main/res/drawable-hdpi/ic_action_snooze.png b/uhabits-android/src/main/res/drawable-hdpi/ic_action_snooze.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_action_snooze.png rename to uhabits-android/src/main/res/drawable-hdpi/ic_action_snooze.png diff --git a/app/src/main/res/drawable-hdpi/ic_action_unarchive_dark.png b/uhabits-android/src/main/res/drawable-hdpi/ic_action_unarchive_dark.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_action_unarchive_dark.png rename to uhabits-android/src/main/res/drawable-hdpi/ic_action_unarchive_dark.png diff --git a/app/src/main/res/drawable-hdpi/ic_action_unarchive_light.png b/uhabits-android/src/main/res/drawable-hdpi/ic_action_unarchive_light.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_action_unarchive_light.png rename to uhabits-android/src/main/res/drawable-hdpi/ic_action_unarchive_light.png diff --git a/app/src/main/res/drawable-hdpi/ic_alarm_black.png b/uhabits-android/src/main/res/drawable-hdpi/ic_alarm_black.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_alarm_black.png rename to uhabits-android/src/main/res/drawable-hdpi/ic_alarm_black.png diff --git a/app/src/main/res/drawable-hdpi/ic_alarm_white.png b/uhabits-android/src/main/res/drawable-hdpi/ic_alarm_white.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_alarm_white.png rename to uhabits-android/src/main/res/drawable-hdpi/ic_alarm_white.png diff --git a/app/src/main/res/drawable-hdpi/ic_colorpicker_swatch_selected.png b/uhabits-android/src/main/res/drawable-hdpi/ic_colorpicker_swatch_selected.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_colorpicker_swatch_selected.png rename to uhabits-android/src/main/res/drawable-hdpi/ic_colorpicker_swatch_selected.png diff --git a/app/src/main/res/drawable-hdpi/ic_notification.png b/uhabits-android/src/main/res/drawable-hdpi/ic_notification.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_notification.png rename to uhabits-android/src/main/res/drawable-hdpi/ic_notification.png diff --git a/app/src/main/res/drawable-hdpi/ic_repeat_black.png b/uhabits-android/src/main/res/drawable-hdpi/ic_repeat_black.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_repeat_black.png rename to uhabits-android/src/main/res/drawable-hdpi/ic_repeat_black.png diff --git a/app/src/main/res/drawable-hdpi/ic_repeat_white.png b/uhabits-android/src/main/res/drawable-hdpi/ic_repeat_white.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_repeat_white.png rename to uhabits-android/src/main/res/drawable-hdpi/ic_repeat_white.png diff --git a/app/src/main/res/drawable-mdpi/ic_action_add_dark.png b/uhabits-android/src/main/res/drawable-mdpi/ic_action_add_dark.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_action_add_dark.png rename to uhabits-android/src/main/res/drawable-mdpi/ic_action_add_dark.png diff --git a/app/src/main/res/drawable-mdpi/ic_action_add_light.png b/uhabits-android/src/main/res/drawable-mdpi/ic_action_add_light.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_action_add_light.png rename to uhabits-android/src/main/res/drawable-mdpi/ic_action_add_light.png diff --git a/app/src/main/res/drawable-mdpi/ic_action_archive_dark.png b/uhabits-android/src/main/res/drawable-mdpi/ic_action_archive_dark.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_action_archive_dark.png rename to uhabits-android/src/main/res/drawable-mdpi/ic_action_archive_dark.png diff --git a/app/src/main/res/drawable-mdpi/ic_action_archive_light.png b/uhabits-android/src/main/res/drawable-mdpi/ic_action_archive_light.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_action_archive_light.png rename to uhabits-android/src/main/res/drawable-mdpi/ic_action_archive_light.png diff --git a/app/src/main/res/drawable-mdpi/ic_action_check.png b/uhabits-android/src/main/res/drawable-mdpi/ic_action_check.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_action_check.png rename to uhabits-android/src/main/res/drawable-mdpi/ic_action_check.png diff --git a/app/src/main/res/drawable-mdpi/ic_action_color_dark.png b/uhabits-android/src/main/res/drawable-mdpi/ic_action_color_dark.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_action_color_dark.png rename to uhabits-android/src/main/res/drawable-mdpi/ic_action_color_dark.png diff --git a/app/src/main/res/drawable-mdpi/ic_action_color_light.png b/uhabits-android/src/main/res/drawable-mdpi/ic_action_color_light.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_action_color_light.png rename to uhabits-android/src/main/res/drawable-mdpi/ic_action_color_light.png diff --git a/app/src/main/res/drawable-mdpi/ic_action_download_dark.png b/uhabits-android/src/main/res/drawable-mdpi/ic_action_download_dark.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_action_download_dark.png rename to uhabits-android/src/main/res/drawable-mdpi/ic_action_download_dark.png diff --git a/app/src/main/res/drawable-mdpi/ic_action_download_light.png b/uhabits-android/src/main/res/drawable-mdpi/ic_action_download_light.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_action_download_light.png rename to uhabits-android/src/main/res/drawable-mdpi/ic_action_download_light.png diff --git a/app/src/main/res/drawable-mdpi/ic_action_edit_dark.png b/uhabits-android/src/main/res/drawable-mdpi/ic_action_edit_dark.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_action_edit_dark.png rename to uhabits-android/src/main/res/drawable-mdpi/ic_action_edit_dark.png diff --git a/app/src/main/res/drawable-mdpi/ic_action_edit_light.png b/uhabits-android/src/main/res/drawable-mdpi/ic_action_edit_light.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_action_edit_light.png rename to uhabits-android/src/main/res/drawable-mdpi/ic_action_edit_light.png diff --git a/app/src/main/res/drawable-mdpi/ic_action_filter_dark.png b/uhabits-android/src/main/res/drawable-mdpi/ic_action_filter_dark.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_action_filter_dark.png rename to uhabits-android/src/main/res/drawable-mdpi/ic_action_filter_dark.png diff --git a/app/src/main/res/drawable-mdpi/ic_action_filter_light.png b/uhabits-android/src/main/res/drawable-mdpi/ic_action_filter_light.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_action_filter_light.png rename to uhabits-android/src/main/res/drawable-mdpi/ic_action_filter_light.png diff --git a/app/src/main/res/drawable-mdpi/ic_action_snooze.png b/uhabits-android/src/main/res/drawable-mdpi/ic_action_snooze.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_action_snooze.png rename to uhabits-android/src/main/res/drawable-mdpi/ic_action_snooze.png diff --git a/app/src/main/res/drawable-mdpi/ic_action_unarchive_dark.png b/uhabits-android/src/main/res/drawable-mdpi/ic_action_unarchive_dark.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_action_unarchive_dark.png rename to uhabits-android/src/main/res/drawable-mdpi/ic_action_unarchive_dark.png diff --git a/app/src/main/res/drawable-mdpi/ic_action_unarchive_light.png b/uhabits-android/src/main/res/drawable-mdpi/ic_action_unarchive_light.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_action_unarchive_light.png rename to uhabits-android/src/main/res/drawable-mdpi/ic_action_unarchive_light.png diff --git a/app/src/main/res/drawable-mdpi/ic_alarm_black.png b/uhabits-android/src/main/res/drawable-mdpi/ic_alarm_black.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_alarm_black.png rename to uhabits-android/src/main/res/drawable-mdpi/ic_alarm_black.png diff --git a/app/src/main/res/drawable-mdpi/ic_alarm_white.png b/uhabits-android/src/main/res/drawable-mdpi/ic_alarm_white.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_alarm_white.png rename to uhabits-android/src/main/res/drawable-mdpi/ic_alarm_white.png diff --git a/app/src/main/res/drawable-mdpi/ic_colorpicker_swatch_selected.png b/uhabits-android/src/main/res/drawable-mdpi/ic_colorpicker_swatch_selected.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_colorpicker_swatch_selected.png rename to uhabits-android/src/main/res/drawable-mdpi/ic_colorpicker_swatch_selected.png diff --git a/app/src/main/res/drawable-mdpi/ic_notification.png b/uhabits-android/src/main/res/drawable-mdpi/ic_notification.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_notification.png rename to uhabits-android/src/main/res/drawable-mdpi/ic_notification.png diff --git a/app/src/main/res/drawable-mdpi/ic_repeat_black.png b/uhabits-android/src/main/res/drawable-mdpi/ic_repeat_black.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_repeat_black.png rename to uhabits-android/src/main/res/drawable-mdpi/ic_repeat_black.png diff --git a/app/src/main/res/drawable-mdpi/ic_repeat_white.png b/uhabits-android/src/main/res/drawable-mdpi/ic_repeat_white.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_repeat_white.png rename to uhabits-android/src/main/res/drawable-mdpi/ic_repeat_white.png diff --git a/app/src/main/res/drawable-nodpi/widget_preview_checkmark.png b/uhabits-android/src/main/res/drawable-nodpi/widget_preview_checkmark.png similarity index 100% rename from app/src/main/res/drawable-nodpi/widget_preview_checkmark.png rename to uhabits-android/src/main/res/drawable-nodpi/widget_preview_checkmark.png diff --git a/app/src/main/res/drawable-nodpi/widget_preview_frequency.png b/uhabits-android/src/main/res/drawable-nodpi/widget_preview_frequency.png similarity index 100% rename from app/src/main/res/drawable-nodpi/widget_preview_frequency.png rename to uhabits-android/src/main/res/drawable-nodpi/widget_preview_frequency.png diff --git a/app/src/main/res/drawable-nodpi/widget_preview_history.png b/uhabits-android/src/main/res/drawable-nodpi/widget_preview_history.png similarity index 100% rename from app/src/main/res/drawable-nodpi/widget_preview_history.png rename to uhabits-android/src/main/res/drawable-nodpi/widget_preview_history.png diff --git a/app/src/main/res/drawable-nodpi/widget_preview_score.png b/uhabits-android/src/main/res/drawable-nodpi/widget_preview_score.png similarity index 100% rename from app/src/main/res/drawable-nodpi/widget_preview_score.png rename to uhabits-android/src/main/res/drawable-nodpi/widget_preview_score.png diff --git a/app/src/main/res/drawable-nodpi/widget_preview_streaks.png b/uhabits-android/src/main/res/drawable-nodpi/widget_preview_streaks.png similarity index 100% rename from app/src/main/res/drawable-nodpi/widget_preview_streaks.png rename to uhabits-android/src/main/res/drawable-nodpi/widget_preview_streaks.png diff --git a/app/src/main/res/drawable-v21/ripple.xml b/uhabits-android/src/main/res/drawable-v21/ripple.xml similarity index 100% rename from app/src/main/res/drawable-v21/ripple.xml rename to uhabits-android/src/main/res/drawable-v21/ripple.xml diff --git a/app/src/main/res/drawable-v21/ripple_transparent.xml b/uhabits-android/src/main/res/drawable-v21/ripple_transparent.xml similarity index 100% rename from app/src/main/res/drawable-v21/ripple_transparent.xml rename to uhabits-android/src/main/res/drawable-v21/ripple_transparent.xml diff --git a/app/src/main/res/drawable-v21/selected_box.xml b/uhabits-android/src/main/res/drawable-v21/selected_box.xml similarity index 100% rename from app/src/main/res/drawable-v21/selected_box.xml rename to uhabits-android/src/main/res/drawable-v21/selected_box.xml diff --git a/app/src/main/res/drawable-v21/widget_button_background.xml b/uhabits-android/src/main/res/drawable-v21/widget_button_background.xml similarity index 100% rename from app/src/main/res/drawable-v21/widget_button_background.xml rename to uhabits-android/src/main/res/drawable-v21/widget_button_background.xml diff --git a/app/src/main/res/drawable-xhdpi/ic_action_add_dark.png b/uhabits-android/src/main/res/drawable-xhdpi/ic_action_add_dark.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_action_add_dark.png rename to uhabits-android/src/main/res/drawable-xhdpi/ic_action_add_dark.png diff --git a/app/src/main/res/drawable-xhdpi/ic_action_add_light.png b/uhabits-android/src/main/res/drawable-xhdpi/ic_action_add_light.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_action_add_light.png rename to uhabits-android/src/main/res/drawable-xhdpi/ic_action_add_light.png diff --git a/app/src/main/res/drawable-xhdpi/ic_action_archive_dark.png b/uhabits-android/src/main/res/drawable-xhdpi/ic_action_archive_dark.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_action_archive_dark.png rename to uhabits-android/src/main/res/drawable-xhdpi/ic_action_archive_dark.png diff --git a/app/src/main/res/drawable-xhdpi/ic_action_archive_light.png b/uhabits-android/src/main/res/drawable-xhdpi/ic_action_archive_light.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_action_archive_light.png rename to uhabits-android/src/main/res/drawable-xhdpi/ic_action_archive_light.png diff --git a/app/src/main/res/drawable-xhdpi/ic_action_check.png b/uhabits-android/src/main/res/drawable-xhdpi/ic_action_check.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_action_check.png rename to uhabits-android/src/main/res/drawable-xhdpi/ic_action_check.png diff --git a/app/src/main/res/drawable-xhdpi/ic_action_color_dark.png b/uhabits-android/src/main/res/drawable-xhdpi/ic_action_color_dark.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_action_color_dark.png rename to uhabits-android/src/main/res/drawable-xhdpi/ic_action_color_dark.png diff --git a/app/src/main/res/drawable-xhdpi/ic_action_color_light.png b/uhabits-android/src/main/res/drawable-xhdpi/ic_action_color_light.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_action_color_light.png rename to uhabits-android/src/main/res/drawable-xhdpi/ic_action_color_light.png diff --git a/app/src/main/res/drawable-xhdpi/ic_action_download_dark.png b/uhabits-android/src/main/res/drawable-xhdpi/ic_action_download_dark.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_action_download_dark.png rename to uhabits-android/src/main/res/drawable-xhdpi/ic_action_download_dark.png diff --git a/app/src/main/res/drawable-xhdpi/ic_action_download_light.png b/uhabits-android/src/main/res/drawable-xhdpi/ic_action_download_light.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_action_download_light.png rename to uhabits-android/src/main/res/drawable-xhdpi/ic_action_download_light.png diff --git a/app/src/main/res/drawable-xhdpi/ic_action_edit_dark.png b/uhabits-android/src/main/res/drawable-xhdpi/ic_action_edit_dark.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_action_edit_dark.png rename to uhabits-android/src/main/res/drawable-xhdpi/ic_action_edit_dark.png diff --git a/app/src/main/res/drawable-xhdpi/ic_action_edit_light.png b/uhabits-android/src/main/res/drawable-xhdpi/ic_action_edit_light.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_action_edit_light.png rename to uhabits-android/src/main/res/drawable-xhdpi/ic_action_edit_light.png diff --git a/app/src/main/res/drawable-xhdpi/ic_action_filter_dark.png b/uhabits-android/src/main/res/drawable-xhdpi/ic_action_filter_dark.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_action_filter_dark.png rename to uhabits-android/src/main/res/drawable-xhdpi/ic_action_filter_dark.png diff --git a/app/src/main/res/drawable-xhdpi/ic_action_filter_light.png b/uhabits-android/src/main/res/drawable-xhdpi/ic_action_filter_light.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_action_filter_light.png rename to uhabits-android/src/main/res/drawable-xhdpi/ic_action_filter_light.png diff --git a/app/src/main/res/drawable-xhdpi/ic_action_snooze.png b/uhabits-android/src/main/res/drawable-xhdpi/ic_action_snooze.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_action_snooze.png rename to uhabits-android/src/main/res/drawable-xhdpi/ic_action_snooze.png diff --git a/app/src/main/res/drawable-xhdpi/ic_action_unarchive_dark.png b/uhabits-android/src/main/res/drawable-xhdpi/ic_action_unarchive_dark.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_action_unarchive_dark.png rename to uhabits-android/src/main/res/drawable-xhdpi/ic_action_unarchive_dark.png diff --git a/app/src/main/res/drawable-xhdpi/ic_action_unarchive_light.png b/uhabits-android/src/main/res/drawable-xhdpi/ic_action_unarchive_light.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_action_unarchive_light.png rename to uhabits-android/src/main/res/drawable-xhdpi/ic_action_unarchive_light.png diff --git a/app/src/main/res/drawable-xhdpi/ic_alarm_black.png b/uhabits-android/src/main/res/drawable-xhdpi/ic_alarm_black.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_alarm_black.png rename to uhabits-android/src/main/res/drawable-xhdpi/ic_alarm_black.png diff --git a/app/src/main/res/drawable-xhdpi/ic_alarm_white.png b/uhabits-android/src/main/res/drawable-xhdpi/ic_alarm_white.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_alarm_white.png rename to uhabits-android/src/main/res/drawable-xhdpi/ic_alarm_white.png diff --git a/app/src/main/res/drawable-xhdpi/ic_colorpicker_swatch_selected.png b/uhabits-android/src/main/res/drawable-xhdpi/ic_colorpicker_swatch_selected.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_colorpicker_swatch_selected.png rename to uhabits-android/src/main/res/drawable-xhdpi/ic_colorpicker_swatch_selected.png diff --git a/app/src/main/res/drawable-xhdpi/ic_notification.png b/uhabits-android/src/main/res/drawable-xhdpi/ic_notification.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_notification.png rename to uhabits-android/src/main/res/drawable-xhdpi/ic_notification.png diff --git a/app/src/main/res/drawable-xhdpi/ic_repeat_black.png b/uhabits-android/src/main/res/drawable-xhdpi/ic_repeat_black.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_repeat_black.png rename to uhabits-android/src/main/res/drawable-xhdpi/ic_repeat_black.png diff --git a/app/src/main/res/drawable-xhdpi/ic_repeat_white.png b/uhabits-android/src/main/res/drawable-xhdpi/ic_repeat_white.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_repeat_white.png rename to uhabits-android/src/main/res/drawable-xhdpi/ic_repeat_white.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_add_dark.png b/uhabits-android/src/main/res/drawable-xxhdpi/ic_action_add_dark.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_action_add_dark.png rename to uhabits-android/src/main/res/drawable-xxhdpi/ic_action_add_dark.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_add_light.png b/uhabits-android/src/main/res/drawable-xxhdpi/ic_action_add_light.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_action_add_light.png rename to uhabits-android/src/main/res/drawable-xxhdpi/ic_action_add_light.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_archive_dark.png b/uhabits-android/src/main/res/drawable-xxhdpi/ic_action_archive_dark.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_action_archive_dark.png rename to uhabits-android/src/main/res/drawable-xxhdpi/ic_action_archive_dark.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_archive_light.png b/uhabits-android/src/main/res/drawable-xxhdpi/ic_action_archive_light.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_action_archive_light.png rename to uhabits-android/src/main/res/drawable-xxhdpi/ic_action_archive_light.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_check.png b/uhabits-android/src/main/res/drawable-xxhdpi/ic_action_check.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_action_check.png rename to uhabits-android/src/main/res/drawable-xxhdpi/ic_action_check.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_color_dark.png b/uhabits-android/src/main/res/drawable-xxhdpi/ic_action_color_dark.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_action_color_dark.png rename to uhabits-android/src/main/res/drawable-xxhdpi/ic_action_color_dark.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_color_light.png b/uhabits-android/src/main/res/drawable-xxhdpi/ic_action_color_light.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_action_color_light.png rename to uhabits-android/src/main/res/drawable-xxhdpi/ic_action_color_light.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_download_dark.png b/uhabits-android/src/main/res/drawable-xxhdpi/ic_action_download_dark.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_action_download_dark.png rename to uhabits-android/src/main/res/drawable-xxhdpi/ic_action_download_dark.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_download_light.png b/uhabits-android/src/main/res/drawable-xxhdpi/ic_action_download_light.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_action_download_light.png rename to uhabits-android/src/main/res/drawable-xxhdpi/ic_action_download_light.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_edit_dark.png b/uhabits-android/src/main/res/drawable-xxhdpi/ic_action_edit_dark.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_action_edit_dark.png rename to uhabits-android/src/main/res/drawable-xxhdpi/ic_action_edit_dark.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_edit_light.png b/uhabits-android/src/main/res/drawable-xxhdpi/ic_action_edit_light.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_action_edit_light.png rename to uhabits-android/src/main/res/drawable-xxhdpi/ic_action_edit_light.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_filter_dark.png b/uhabits-android/src/main/res/drawable-xxhdpi/ic_action_filter_dark.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_action_filter_dark.png rename to uhabits-android/src/main/res/drawable-xxhdpi/ic_action_filter_dark.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_filter_light.png b/uhabits-android/src/main/res/drawable-xxhdpi/ic_action_filter_light.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_action_filter_light.png rename to uhabits-android/src/main/res/drawable-xxhdpi/ic_action_filter_light.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_snooze.png b/uhabits-android/src/main/res/drawable-xxhdpi/ic_action_snooze.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_action_snooze.png rename to uhabits-android/src/main/res/drawable-xxhdpi/ic_action_snooze.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_unarchive_dark.png b/uhabits-android/src/main/res/drawable-xxhdpi/ic_action_unarchive_dark.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_action_unarchive_dark.png rename to uhabits-android/src/main/res/drawable-xxhdpi/ic_action_unarchive_dark.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_unarchive_light.png b/uhabits-android/src/main/res/drawable-xxhdpi/ic_action_unarchive_light.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_action_unarchive_light.png rename to uhabits-android/src/main/res/drawable-xxhdpi/ic_action_unarchive_light.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_alarm_black.png b/uhabits-android/src/main/res/drawable-xxhdpi/ic_alarm_black.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_alarm_black.png rename to uhabits-android/src/main/res/drawable-xxhdpi/ic_alarm_black.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_alarm_white.png b/uhabits-android/src/main/res/drawable-xxhdpi/ic_alarm_white.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_alarm_white.png rename to uhabits-android/src/main/res/drawable-xxhdpi/ic_alarm_white.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_notification.png b/uhabits-android/src/main/res/drawable-xxhdpi/ic_notification.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_notification.png rename to uhabits-android/src/main/res/drawable-xxhdpi/ic_notification.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_repeat_black.png b/uhabits-android/src/main/res/drawable-xxhdpi/ic_repeat_black.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_repeat_black.png rename to uhabits-android/src/main/res/drawable-xxhdpi/ic_repeat_black.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_repeat_white.png b/uhabits-android/src/main/res/drawable-xxhdpi/ic_repeat_white.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_repeat_white.png rename to uhabits-android/src/main/res/drawable-xxhdpi/ic_repeat_white.png diff --git a/app/src/main/res/drawable-xxxhdpi/ic_action_add_light.png b/uhabits-android/src/main/res/drawable-xxxhdpi/ic_action_add_light.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/ic_action_add_light.png rename to uhabits-android/src/main/res/drawable-xxxhdpi/ic_action_add_light.png diff --git a/app/src/main/res/drawable-xxxhdpi/ic_action_filter_dark.png b/uhabits-android/src/main/res/drawable-xxxhdpi/ic_action_filter_dark.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/ic_action_filter_dark.png rename to uhabits-android/src/main/res/drawable-xxxhdpi/ic_action_filter_dark.png diff --git a/app/src/main/res/drawable-xxxhdpi/ic_action_filter_light.png b/uhabits-android/src/main/res/drawable-xxxhdpi/ic_action_filter_light.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/ic_action_filter_light.png rename to uhabits-android/src/main/res/drawable-xxxhdpi/ic_action_filter_light.png diff --git a/app/src/main/res/drawable-xxxhdpi/ic_alarm_black.png b/uhabits-android/src/main/res/drawable-xxxhdpi/ic_alarm_black.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/ic_alarm_black.png rename to uhabits-android/src/main/res/drawable-xxxhdpi/ic_alarm_black.png diff --git a/app/src/main/res/drawable-xxxhdpi/ic_alarm_white.png b/uhabits-android/src/main/res/drawable-xxxhdpi/ic_alarm_white.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/ic_alarm_white.png rename to uhabits-android/src/main/res/drawable-xxxhdpi/ic_alarm_white.png diff --git a/app/src/main/res/drawable-xxxhdpi/ic_repeat_black.png b/uhabits-android/src/main/res/drawable-xxxhdpi/ic_repeat_black.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/ic_repeat_black.png rename to uhabits-android/src/main/res/drawable-xxxhdpi/ic_repeat_black.png diff --git a/app/src/main/res/drawable-xxxhdpi/ic_repeat_white.png b/uhabits-android/src/main/res/drawable-xxxhdpi/ic_repeat_white.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/ic_repeat_white.png rename to uhabits-android/src/main/res/drawable-xxxhdpi/ic_repeat_white.png diff --git a/app/src/main/res/drawable/card_amoled_background.xml b/uhabits-android/src/main/res/drawable/card_amoled_background.xml similarity index 100% rename from app/src/main/res/drawable/card_amoled_background.xml rename to uhabits-android/src/main/res/drawable/card_amoled_background.xml diff --git a/app/src/main/res/drawable/card_dark_background.xml b/uhabits-android/src/main/res/drawable/card_dark_background.xml similarity index 100% rename from app/src/main/res/drawable/card_dark_background.xml rename to uhabits-android/src/main/res/drawable/card_dark_background.xml diff --git a/app/src/main/res/drawable/card_light_background.xml b/uhabits-android/src/main/res/drawable/card_light_background.xml similarity index 100% rename from app/src/main/res/drawable/card_light_background.xml rename to uhabits-android/src/main/res/drawable/card_light_background.xml diff --git a/app/src/main/res/drawable/color_picker_swatch.xml b/uhabits-android/src/main/res/drawable/color_picker_swatch.xml similarity index 100% rename from app/src/main/res/drawable/color_picker_swatch.xml rename to uhabits-android/src/main/res/drawable/color_picker_swatch.xml diff --git a/app/src/main/res/drawable/done_background_color.xml b/uhabits-android/src/main/res/drawable/done_background_color.xml similarity index 100% rename from app/src/main/res/drawable/done_background_color.xml rename to uhabits-android/src/main/res/drawable/done_background_color.xml diff --git a/app/src/main/res/drawable/done_background_color_dark.xml b/uhabits-android/src/main/res/drawable/done_background_color_dark.xml similarity index 100% rename from app/src/main/res/drawable/done_background_color_dark.xml rename to uhabits-android/src/main/res/drawable/done_background_color_dark.xml diff --git a/app/src/main/res/drawable/intro_icon_1.png b/uhabits-android/src/main/res/drawable/intro_icon_1.png similarity index 100% rename from app/src/main/res/drawable/intro_icon_1.png rename to uhabits-android/src/main/res/drawable/intro_icon_1.png diff --git a/app/src/main/res/drawable/intro_icon_2.png b/uhabits-android/src/main/res/drawable/intro_icon_2.png similarity index 100% rename from app/src/main/res/drawable/intro_icon_2.png rename to uhabits-android/src/main/res/drawable/intro_icon_2.png diff --git a/app/src/main/res/drawable/intro_icon_4.png b/uhabits-android/src/main/res/drawable/intro_icon_4.png similarity index 100% rename from app/src/main/res/drawable/intro_icon_4.png rename to uhabits-android/src/main/res/drawable/intro_icon_4.png diff --git a/app/src/main/res/drawable/selected_box_amoled.xml b/uhabits-android/src/main/res/drawable/selected_box_amoled.xml similarity index 100% rename from app/src/main/res/drawable/selected_box_amoled.xml rename to uhabits-android/src/main/res/drawable/selected_box_amoled.xml diff --git a/app/src/main/res/drawable/selected_box_dark.xml b/uhabits-android/src/main/res/drawable/selected_box_dark.xml similarity index 100% rename from app/src/main/res/drawable/selected_box_dark.xml rename to uhabits-android/src/main/res/drawable/selected_box_dark.xml diff --git a/app/src/main/res/drawable/selected_box_light.xml b/uhabits-android/src/main/res/drawable/selected_box_light.xml similarity index 100% rename from app/src/main/res/drawable/selected_box_light.xml rename to uhabits-android/src/main/res/drawable/selected_box_light.xml diff --git a/app/src/main/res/drawable/stripe.png b/uhabits-android/src/main/res/drawable/stripe.png similarity index 100% rename from app/src/main/res/drawable/stripe.png rename to uhabits-android/src/main/res/drawable/stripe.png diff --git a/app/src/main/res/drawable/toolbar_shadow.xml b/uhabits-android/src/main/res/drawable/toolbar_shadow.xml similarity index 100% rename from app/src/main/res/drawable/toolbar_shadow.xml rename to uhabits-android/src/main/res/drawable/toolbar_shadow.xml diff --git a/app/src/main/res/drawable/widget_background.xml b/uhabits-android/src/main/res/drawable/widget_background.xml similarity index 100% rename from app/src/main/res/drawable/widget_background.xml rename to uhabits-android/src/main/res/drawable/widget_background.xml diff --git a/app/src/main/res/drawable/widget_button_background.xml b/uhabits-android/src/main/res/drawable/widget_button_background.xml similarity index 100% rename from app/src/main/res/drawable/widget_button_background.xml rename to uhabits-android/src/main/res/drawable/widget_button_background.xml diff --git a/app/src/main/res/layout/about.xml b/uhabits-android/src/main/res/layout/about.xml similarity index 100% rename from app/src/main/res/layout/about.xml rename to uhabits-android/src/main/res/layout/about.xml diff --git a/app/src/main/res/layout/automation.xml b/uhabits-android/src/main/res/layout/automation.xml similarity index 100% rename from app/src/main/res/layout/automation.xml rename to uhabits-android/src/main/res/layout/automation.xml diff --git a/app/src/main/res/layout/color_picker_dialog.xml b/uhabits-android/src/main/res/layout/color_picker_dialog.xml similarity index 100% rename from app/src/main/res/layout/color_picker_dialog.xml rename to uhabits-android/src/main/res/layout/color_picker_dialog.xml diff --git a/app/src/main/res/layout/color_picker_swatch.xml b/uhabits-android/src/main/res/layout/color_picker_swatch.xml similarity index 100% rename from app/src/main/res/layout/color_picker_swatch.xml rename to uhabits-android/src/main/res/layout/color_picker_swatch.xml diff --git a/app/src/main/res/layout/date_picker_dialog.xml b/uhabits-android/src/main/res/layout/date_picker_dialog.xml similarity index 100% rename from app/src/main/res/layout/date_picker_dialog.xml rename to uhabits-android/src/main/res/layout/date_picker_dialog.xml diff --git a/app/src/main/res/layout/date_picker_done_button.xml b/uhabits-android/src/main/res/layout/date_picker_done_button.xml similarity index 100% rename from app/src/main/res/layout/date_picker_done_button.xml rename to uhabits-android/src/main/res/layout/date_picker_done_button.xml diff --git a/app/src/main/res/layout/date_picker_header_view.xml b/uhabits-android/src/main/res/layout/date_picker_header_view.xml similarity index 100% rename from app/src/main/res/layout/date_picker_header_view.xml rename to uhabits-android/src/main/res/layout/date_picker_header_view.xml diff --git a/app/src/main/res/layout/date_picker_selected_date.xml b/uhabits-android/src/main/res/layout/date_picker_selected_date.xml similarity index 100% rename from app/src/main/res/layout/date_picker_selected_date.xml rename to uhabits-android/src/main/res/layout/date_picker_selected_date.xml diff --git a/app/src/main/res/layout/date_picker_view_animator.xml b/uhabits-android/src/main/res/layout/date_picker_view_animator.xml similarity index 100% rename from app/src/main/res/layout/date_picker_view_animator.xml rename to uhabits-android/src/main/res/layout/date_picker_view_animator.xml diff --git a/app/src/main/res/layout/edit_habit.xml b/uhabits-android/src/main/res/layout/edit_habit.xml similarity index 100% rename from app/src/main/res/layout/edit_habit.xml rename to uhabits-android/src/main/res/layout/edit_habit.xml diff --git a/app/src/main/res/layout/edit_habit_frequency.xml b/uhabits-android/src/main/res/layout/edit_habit_frequency.xml similarity index 100% rename from app/src/main/res/layout/edit_habit_frequency.xml rename to uhabits-android/src/main/res/layout/edit_habit_frequency.xml diff --git a/app/src/main/res/layout/edit_habit_name.xml b/uhabits-android/src/main/res/layout/edit_habit_name.xml similarity index 100% rename from app/src/main/res/layout/edit_habit_name.xml rename to uhabits-android/src/main/res/layout/edit_habit_name.xml diff --git a/app/src/main/res/layout/edit_habit_reminder.xml b/uhabits-android/src/main/res/layout/edit_habit_reminder.xml similarity index 100% rename from app/src/main/res/layout/edit_habit_reminder.xml rename to uhabits-android/src/main/res/layout/edit_habit_reminder.xml diff --git a/app/src/main/res/layout/edit_habit_target.xml b/uhabits-android/src/main/res/layout/edit_habit_target.xml similarity index 100% rename from app/src/main/res/layout/edit_habit_target.xml rename to uhabits-android/src/main/res/layout/edit_habit_target.xml diff --git a/app/src/main/res/layout/filter.xml b/uhabits-android/src/main/res/layout/filter.xml similarity index 100% rename from app/src/main/res/layout/filter.xml rename to uhabits-android/src/main/res/layout/filter.xml diff --git a/app/src/main/res/layout/list_habits.xml b/uhabits-android/src/main/res/layout/list_habits.xml similarity index 100% rename from app/src/main/res/layout/list_habits.xml rename to uhabits-android/src/main/res/layout/list_habits.xml diff --git a/app/src/main/res/layout/list_habits_button_preview.xml b/uhabits-android/src/main/res/layout/list_habits_button_preview.xml similarity index 100% rename from app/src/main/res/layout/list_habits_button_preview.xml rename to uhabits-android/src/main/res/layout/list_habits_button_preview.xml diff --git a/app/src/main/res/layout/list_habits_hint.xml b/uhabits-android/src/main/res/layout/list_habits_hint.xml similarity index 100% rename from app/src/main/res/layout/list_habits_hint.xml rename to uhabits-android/src/main/res/layout/list_habits_hint.xml diff --git a/app/src/main/res/layout/list_habits_panel_preview.xml b/uhabits-android/src/main/res/layout/list_habits_panel_preview.xml similarity index 100% rename from app/src/main/res/layout/list_habits_panel_preview.xml rename to uhabits-android/src/main/res/layout/list_habits_panel_preview.xml diff --git a/app/src/main/res/layout/list_habits_preview.xml b/uhabits-android/src/main/res/layout/list_habits_preview.xml similarity index 100% rename from app/src/main/res/layout/list_habits_preview.xml rename to uhabits-android/src/main/res/layout/list_habits_preview.xml diff --git a/app/src/main/res/layout/number_picker_dialog.xml b/uhabits-android/src/main/res/layout/number_picker_dialog.xml similarity index 100% rename from app/src/main/res/layout/number_picker_dialog.xml rename to uhabits-android/src/main/res/layout/number_picker_dialog.xml diff --git a/app/src/main/res/layout/preference_category_custom.xml b/uhabits-android/src/main/res/layout/preference_category_custom.xml similarity index 100% rename from app/src/main/res/layout/preference_category_custom.xml rename to uhabits-android/src/main/res/layout/preference_category_custom.xml diff --git a/app/src/main/res/layout/settings_activity.xml b/uhabits-android/src/main/res/layout/settings_activity.xml similarity index 100% rename from app/src/main/res/layout/settings_activity.xml rename to uhabits-android/src/main/res/layout/settings_activity.xml diff --git a/app/src/main/res/layout/show_habit.xml b/uhabits-android/src/main/res/layout/show_habit.xml similarity index 100% rename from app/src/main/res/layout/show_habit.xml rename to uhabits-android/src/main/res/layout/show_habit.xml diff --git a/app/src/main/res/layout/show_habit_bar.xml b/uhabits-android/src/main/res/layout/show_habit_bar.xml similarity index 100% rename from app/src/main/res/layout/show_habit_bar.xml rename to uhabits-android/src/main/res/layout/show_habit_bar.xml diff --git a/app/src/main/res/layout/show_habit_frequency.xml b/uhabits-android/src/main/res/layout/show_habit_frequency.xml similarity index 100% rename from app/src/main/res/layout/show_habit_frequency.xml rename to uhabits-android/src/main/res/layout/show_habit_frequency.xml diff --git a/app/src/main/res/layout/show_habit_history.xml b/uhabits-android/src/main/res/layout/show_habit_history.xml similarity index 100% rename from app/src/main/res/layout/show_habit_history.xml rename to uhabits-android/src/main/res/layout/show_habit_history.xml diff --git a/app/src/main/res/layout/show_habit_inner.xml b/uhabits-android/src/main/res/layout/show_habit_inner.xml similarity index 100% rename from app/src/main/res/layout/show_habit_inner.xml rename to uhabits-android/src/main/res/layout/show_habit_inner.xml diff --git a/app/src/main/res/layout/show_habit_overview.xml b/uhabits-android/src/main/res/layout/show_habit_overview.xml similarity index 100% rename from app/src/main/res/layout/show_habit_overview.xml rename to uhabits-android/src/main/res/layout/show_habit_overview.xml diff --git a/app/src/main/res/layout/show_habit_preview.xml b/uhabits-android/src/main/res/layout/show_habit_preview.xml similarity index 100% rename from app/src/main/res/layout/show_habit_preview.xml rename to uhabits-android/src/main/res/layout/show_habit_preview.xml diff --git a/app/src/main/res/layout/show_habit_score.xml b/uhabits-android/src/main/res/layout/show_habit_score.xml similarity index 100% rename from app/src/main/res/layout/show_habit_score.xml rename to uhabits-android/src/main/res/layout/show_habit_score.xml diff --git a/app/src/main/res/layout/show_habit_streak.xml b/uhabits-android/src/main/res/layout/show_habit_streak.xml similarity index 100% rename from app/src/main/res/layout/show_habit_streak.xml rename to uhabits-android/src/main/res/layout/show_habit_streak.xml diff --git a/app/src/main/res/layout/show_habit_subtitle.xml b/uhabits-android/src/main/res/layout/show_habit_subtitle.xml similarity index 100% rename from app/src/main/res/layout/show_habit_subtitle.xml rename to uhabits-android/src/main/res/layout/show_habit_subtitle.xml diff --git a/app/src/main/res/layout/time_header_label.xml b/uhabits-android/src/main/res/layout/time_header_label.xml similarity index 100% rename from app/src/main/res/layout/time_header_label.xml rename to uhabits-android/src/main/res/layout/time_header_label.xml diff --git a/app/src/main/res/layout/time_picker_dialog.xml b/uhabits-android/src/main/res/layout/time_picker_dialog.xml similarity index 100% rename from app/src/main/res/layout/time_picker_dialog.xml rename to uhabits-android/src/main/res/layout/time_picker_dialog.xml diff --git a/app/src/main/res/layout/widget_checkmark.xml b/uhabits-android/src/main/res/layout/widget_checkmark.xml similarity index 100% rename from app/src/main/res/layout/widget_checkmark.xml rename to uhabits-android/src/main/res/layout/widget_checkmark.xml diff --git a/app/src/main/res/layout/widget_configure_activity.xml b/uhabits-android/src/main/res/layout/widget_configure_activity.xml similarity index 100% rename from app/src/main/res/layout/widget_configure_activity.xml rename to uhabits-android/src/main/res/layout/widget_configure_activity.xml diff --git a/app/src/main/res/layout/widget_error.xml b/uhabits-android/src/main/res/layout/widget_error.xml similarity index 100% rename from app/src/main/res/layout/widget_error.xml rename to uhabits-android/src/main/res/layout/widget_error.xml diff --git a/app/src/main/res/layout/widget_graph.xml b/uhabits-android/src/main/res/layout/widget_graph.xml similarity index 100% rename from app/src/main/res/layout/widget_graph.xml rename to uhabits-android/src/main/res/layout/widget_graph.xml diff --git a/app/src/main/res/layout/widget_wrapper.xml b/uhabits-android/src/main/res/layout/widget_wrapper.xml similarity index 100% rename from app/src/main/res/layout/widget_wrapper.xml rename to uhabits-android/src/main/res/layout/widget_wrapper.xml diff --git a/app/src/main/res/layout/year_label_text_view.xml b/uhabits-android/src/main/res/layout/year_label_text_view.xml similarity index 100% rename from app/src/main/res/layout/year_label_text_view.xml rename to uhabits-android/src/main/res/layout/year_label_text_view.xml diff --git a/app/src/main/res/menu/list_habits.xml b/uhabits-android/src/main/res/menu/list_habits.xml similarity index 100% rename from app/src/main/res/menu/list_habits.xml rename to uhabits-android/src/main/res/menu/list_habits.xml diff --git a/app/src/main/res/menu/list_habits_selection.xml b/uhabits-android/src/main/res/menu/list_habits_selection.xml similarity index 100% rename from app/src/main/res/menu/list_habits_selection.xml rename to uhabits-android/src/main/res/menu/list_habits_selection.xml diff --git a/app/src/main/res/menu/show_habit.xml b/uhabits-android/src/main/res/menu/show_habit.xml similarity index 100% rename from app/src/main/res/menu/show_habit.xml rename to uhabits-android/src/main/res/menu/show_habit.xml diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/uhabits-android/src/main/res/mipmap-mdpi/ic_launcher.png similarity index 100% rename from app/src/main/res/mipmap-mdpi/ic_launcher.png rename to uhabits-android/src/main/res/mipmap-mdpi/ic_launcher.png diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/uhabits-android/src/main/res/mipmap-xxxhdpi/ic_launcher.png similarity index 100% rename from app/src/main/res/mipmap-xxxhdpi/ic_launcher.png rename to uhabits-android/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/app/src/main/res/values-af/strings.xml b/uhabits-android/src/main/res/values-af/strings.xml similarity index 100% rename from app/src/main/res/values-af/strings.xml rename to uhabits-android/src/main/res/values-af/strings.xml diff --git a/app/src/main/res/values-ar/strings.xml b/uhabits-android/src/main/res/values-ar/strings.xml similarity index 100% rename from app/src/main/res/values-ar/strings.xml rename to uhabits-android/src/main/res/values-ar/strings.xml diff --git a/app/src/main/res/values-bg/strings.xml b/uhabits-android/src/main/res/values-bg/strings.xml similarity index 100% rename from app/src/main/res/values-bg/strings.xml rename to uhabits-android/src/main/res/values-bg/strings.xml diff --git a/app/src/main/res/values-ca/strings.xml b/uhabits-android/src/main/res/values-ca/strings.xml similarity index 100% rename from app/src/main/res/values-ca/strings.xml rename to uhabits-android/src/main/res/values-ca/strings.xml diff --git a/app/src/main/res/values-cs/strings.xml b/uhabits-android/src/main/res/values-cs/strings.xml similarity index 100% rename from app/src/main/res/values-cs/strings.xml rename to uhabits-android/src/main/res/values-cs/strings.xml diff --git a/app/src/main/res/values-da/strings.xml b/uhabits-android/src/main/res/values-da/strings.xml similarity index 100% rename from app/src/main/res/values-da/strings.xml rename to uhabits-android/src/main/res/values-da/strings.xml diff --git a/app/src/main/res/values-de/strings.xml b/uhabits-android/src/main/res/values-de/strings.xml similarity index 100% rename from app/src/main/res/values-de/strings.xml rename to uhabits-android/src/main/res/values-de/strings.xml diff --git a/app/src/main/res/values-el/strings.xml b/uhabits-android/src/main/res/values-el/strings.xml similarity index 100% rename from app/src/main/res/values-el/strings.xml rename to uhabits-android/src/main/res/values-el/strings.xml diff --git a/app/src/main/res/values-eo/strings.xml b/uhabits-android/src/main/res/values-eo/strings.xml similarity index 100% rename from app/src/main/res/values-eo/strings.xml rename to uhabits-android/src/main/res/values-eo/strings.xml diff --git a/app/src/main/res/values-es/strings.xml b/uhabits-android/src/main/res/values-es/strings.xml similarity index 100% rename from app/src/main/res/values-es/strings.xml rename to uhabits-android/src/main/res/values-es/strings.xml diff --git a/app/src/main/res/values-eu/strings.xml b/uhabits-android/src/main/res/values-eu/strings.xml similarity index 100% rename from app/src/main/res/values-eu/strings.xml rename to uhabits-android/src/main/res/values-eu/strings.xml diff --git a/app/src/main/res/values-fa/strings.xml b/uhabits-android/src/main/res/values-fa/strings.xml similarity index 100% rename from app/src/main/res/values-fa/strings.xml rename to uhabits-android/src/main/res/values-fa/strings.xml diff --git a/app/src/main/res/values-fi/strings.xml b/uhabits-android/src/main/res/values-fi/strings.xml similarity index 100% rename from app/src/main/res/values-fi/strings.xml rename to uhabits-android/src/main/res/values-fi/strings.xml diff --git a/app/src/main/res/values-fr/strings.xml b/uhabits-android/src/main/res/values-fr/strings.xml similarity index 100% rename from app/src/main/res/values-fr/strings.xml rename to uhabits-android/src/main/res/values-fr/strings.xml diff --git a/app/src/main/res/values-hi/strings.xml b/uhabits-android/src/main/res/values-hi/strings.xml similarity index 100% rename from app/src/main/res/values-hi/strings.xml rename to uhabits-android/src/main/res/values-hi/strings.xml diff --git a/app/src/main/res/values-hr/strings.xml b/uhabits-android/src/main/res/values-hr/strings.xml similarity index 100% rename from app/src/main/res/values-hr/strings.xml rename to uhabits-android/src/main/res/values-hr/strings.xml diff --git a/app/src/main/res/values-hu/strings.xml b/uhabits-android/src/main/res/values-hu/strings.xml similarity index 100% rename from app/src/main/res/values-hu/strings.xml rename to uhabits-android/src/main/res/values-hu/strings.xml diff --git a/app/src/main/res/values-id/strings.xml b/uhabits-android/src/main/res/values-id/strings.xml similarity index 100% rename from app/src/main/res/values-id/strings.xml rename to uhabits-android/src/main/res/values-id/strings.xml diff --git a/app/src/main/res/values-in/strings.xml b/uhabits-android/src/main/res/values-in/strings.xml similarity index 100% rename from app/src/main/res/values-in/strings.xml rename to uhabits-android/src/main/res/values-in/strings.xml diff --git a/app/src/main/res/values-it/strings.xml b/uhabits-android/src/main/res/values-it/strings.xml similarity index 100% rename from app/src/main/res/values-it/strings.xml rename to uhabits-android/src/main/res/values-it/strings.xml diff --git a/app/src/main/res/values-iw/strings.xml b/uhabits-android/src/main/res/values-iw/strings.xml similarity index 100% rename from app/src/main/res/values-iw/strings.xml rename to uhabits-android/src/main/res/values-iw/strings.xml diff --git a/app/src/main/res/values-ja/strings.xml b/uhabits-android/src/main/res/values-ja/strings.xml similarity index 100% rename from app/src/main/res/values-ja/strings.xml rename to uhabits-android/src/main/res/values-ja/strings.xml diff --git a/app/src/main/res/values-ko/strings.xml b/uhabits-android/src/main/res/values-ko/strings.xml similarity index 100% rename from app/src/main/res/values-ko/strings.xml rename to uhabits-android/src/main/res/values-ko/strings.xml diff --git a/app/src/main/res/values-nl/strings.xml b/uhabits-android/src/main/res/values-nl/strings.xml similarity index 100% rename from app/src/main/res/values-nl/strings.xml rename to uhabits-android/src/main/res/values-nl/strings.xml diff --git a/app/src/main/res/values-no-rNO/strings.xml b/uhabits-android/src/main/res/values-no-rNO/strings.xml similarity index 100% rename from app/src/main/res/values-no-rNO/strings.xml rename to uhabits-android/src/main/res/values-no-rNO/strings.xml diff --git a/app/src/main/res/values-pl/strings.xml b/uhabits-android/src/main/res/values-pl/strings.xml similarity index 100% rename from app/src/main/res/values-pl/strings.xml rename to uhabits-android/src/main/res/values-pl/strings.xml diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/uhabits-android/src/main/res/values-pt-rBR/strings.xml similarity index 100% rename from app/src/main/res/values-pt-rBR/strings.xml rename to uhabits-android/src/main/res/values-pt-rBR/strings.xml diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/uhabits-android/src/main/res/values-pt-rPT/strings.xml similarity index 100% rename from app/src/main/res/values-pt-rPT/strings.xml rename to uhabits-android/src/main/res/values-pt-rPT/strings.xml diff --git a/app/src/main/res/values-ro/strings.xml b/uhabits-android/src/main/res/values-ro/strings.xml similarity index 100% rename from app/src/main/res/values-ro/strings.xml rename to uhabits-android/src/main/res/values-ro/strings.xml diff --git a/app/src/main/res/values-ru/strings.xml b/uhabits-android/src/main/res/values-ru/strings.xml similarity index 100% rename from app/src/main/res/values-ru/strings.xml rename to uhabits-android/src/main/res/values-ru/strings.xml diff --git a/app/src/main/res/values-sl/strings.xml b/uhabits-android/src/main/res/values-sl/strings.xml similarity index 100% rename from app/src/main/res/values-sl/strings.xml rename to uhabits-android/src/main/res/values-sl/strings.xml diff --git a/app/src/main/res/values-sr/strings.xml b/uhabits-android/src/main/res/values-sr/strings.xml similarity index 100% rename from app/src/main/res/values-sr/strings.xml rename to uhabits-android/src/main/res/values-sr/strings.xml diff --git a/app/src/main/res/values-sv/strings.xml b/uhabits-android/src/main/res/values-sv/strings.xml similarity index 100% rename from app/src/main/res/values-sv/strings.xml rename to uhabits-android/src/main/res/values-sv/strings.xml diff --git a/app/src/main/res/values-tr/strings.xml b/uhabits-android/src/main/res/values-tr/strings.xml similarity index 100% rename from app/src/main/res/values-tr/strings.xml rename to uhabits-android/src/main/res/values-tr/strings.xml diff --git a/app/src/main/res/values-uk/strings.xml b/uhabits-android/src/main/res/values-uk/strings.xml similarity index 100% rename from app/src/main/res/values-uk/strings.xml rename to uhabits-android/src/main/res/values-uk/strings.xml diff --git a/app/src/main/res/values-v21/styles.xml b/uhabits-android/src/main/res/values-v21/styles.xml similarity index 100% rename from app/src/main/res/values-v21/styles.xml rename to uhabits-android/src/main/res/values-v21/styles.xml diff --git a/app/src/main/res/values-v21/styles_list_habits.xml b/uhabits-android/src/main/res/values-v21/styles_list_habits.xml similarity index 100% rename from app/src/main/res/values-v21/styles_list_habits.xml rename to uhabits-android/src/main/res/values-v21/styles_list_habits.xml diff --git a/app/src/main/res/values-vi/strings.xml b/uhabits-android/src/main/res/values-vi/strings.xml similarity index 100% rename from app/src/main/res/values-vi/strings.xml rename to uhabits-android/src/main/res/values-vi/strings.xml diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/uhabits-android/src/main/res/values-zh-rCN/strings.xml similarity index 100% rename from app/src/main/res/values-zh-rCN/strings.xml rename to uhabits-android/src/main/res/values-zh-rCN/strings.xml diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/uhabits-android/src/main/res/values-zh-rTW/strings.xml similarity index 100% rename from app/src/main/res/values-zh-rTW/strings.xml rename to uhabits-android/src/main/res/values-zh-rTW/strings.xml diff --git a/app/src/main/res/values/attrs.xml b/uhabits-android/src/main/res/values/attrs.xml similarity index 100% rename from app/src/main/res/values/attrs.xml rename to uhabits-android/src/main/res/values/attrs.xml diff --git a/app/src/main/res/values/colors.xml b/uhabits-android/src/main/res/values/colors.xml similarity index 100% rename from app/src/main/res/values/colors.xml rename to uhabits-android/src/main/res/values/colors.xml diff --git a/app/src/main/res/values/constants.xml b/uhabits-android/src/main/res/values/constants.xml similarity index 100% rename from app/src/main/res/values/constants.xml rename to uhabits-android/src/main/res/values/constants.xml diff --git a/app/src/main/res/values/dimens.xml b/uhabits-android/src/main/res/values/dimens.xml similarity index 100% rename from app/src/main/res/values/dimens.xml rename to uhabits-android/src/main/res/values/dimens.xml diff --git a/app/src/main/res/values/fontawesome.xml b/uhabits-android/src/main/res/values/fontawesome.xml similarity index 100% rename from app/src/main/res/values/fontawesome.xml rename to uhabits-android/src/main/res/values/fontawesome.xml diff --git a/app/src/main/res/values/keys.xml b/uhabits-android/src/main/res/values/keys.xml similarity index 100% rename from app/src/main/res/values/keys.xml rename to uhabits-android/src/main/res/values/keys.xml diff --git a/app/src/main/res/values/pickers.xml b/uhabits-android/src/main/res/values/pickers.xml similarity index 100% rename from app/src/main/res/values/pickers.xml rename to uhabits-android/src/main/res/values/pickers.xml diff --git a/app/src/main/res/values/strings.xml b/uhabits-android/src/main/res/values/strings.xml similarity index 100% rename from app/src/main/res/values/strings.xml rename to uhabits-android/src/main/res/values/strings.xml diff --git a/app/src/main/res/values/styles.xml b/uhabits-android/src/main/res/values/styles.xml similarity index 100% rename from app/src/main/res/values/styles.xml rename to uhabits-android/src/main/res/values/styles.xml diff --git a/app/src/main/res/values/styles_dialog.xml b/uhabits-android/src/main/res/values/styles_dialog.xml similarity index 100% rename from app/src/main/res/values/styles_dialog.xml rename to uhabits-android/src/main/res/values/styles_dialog.xml diff --git a/app/src/main/res/values/styles_list_habits.xml b/uhabits-android/src/main/res/values/styles_list_habits.xml similarity index 100% rename from app/src/main/res/values/styles_list_habits.xml rename to uhabits-android/src/main/res/values/styles_list_habits.xml diff --git a/app/src/main/res/values/styles_show_habit.xml b/uhabits-android/src/main/res/values/styles_show_habit.xml similarity index 100% rename from app/src/main/res/values/styles_show_habit.xml rename to uhabits-android/src/main/res/values/styles_show_habit.xml diff --git a/app/src/main/res/xml/file_paths.xml b/uhabits-android/src/main/res/xml/file_paths.xml similarity index 100% rename from app/src/main/res/xml/file_paths.xml rename to uhabits-android/src/main/res/xml/file_paths.xml diff --git a/app/src/main/res/xml/preferences.xml b/uhabits-android/src/main/res/xml/preferences.xml similarity index 100% rename from app/src/main/res/xml/preferences.xml rename to uhabits-android/src/main/res/xml/preferences.xml diff --git a/app/src/main/res/xml/widget_checkmark_info.xml b/uhabits-android/src/main/res/xml/widget_checkmark_info.xml similarity index 100% rename from app/src/main/res/xml/widget_checkmark_info.xml rename to uhabits-android/src/main/res/xml/widget_checkmark_info.xml diff --git a/app/src/main/res/xml/widget_frequency_info.xml b/uhabits-android/src/main/res/xml/widget_frequency_info.xml similarity index 100% rename from app/src/main/res/xml/widget_frequency_info.xml rename to uhabits-android/src/main/res/xml/widget_frequency_info.xml diff --git a/app/src/main/res/xml/widget_history_info.xml b/uhabits-android/src/main/res/xml/widget_history_info.xml similarity index 100% rename from app/src/main/res/xml/widget_history_info.xml rename to uhabits-android/src/main/res/xml/widget_history_info.xml diff --git a/app/src/main/res/xml/widget_score_info.xml b/uhabits-android/src/main/res/xml/widget_score_info.xml similarity index 100% rename from app/src/main/res/xml/widget_score_info.xml rename to uhabits-android/src/main/res/xml/widget_score_info.xml diff --git a/app/src/main/res/xml/widget_streak_info.xml b/uhabits-android/src/main/res/xml/widget_streak_info.xml similarity index 100% rename from app/src/main/res/xml/widget_streak_info.xml rename to uhabits-android/src/main/res/xml/widget_streak_info.xml diff --git a/uhabits-android/src/test/java/org/isoron/uhabits/BaseAndroidUnitTest.java b/uhabits-android/src/test/java/org/isoron/uhabits/BaseAndroidUnitTest.java new file mode 100644 index 000000000..95a6ac9db --- /dev/null +++ b/uhabits-android/src/test/java/org/isoron/uhabits/BaseAndroidUnitTest.java @@ -0,0 +1,80 @@ +/* + * 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; + +import org.isoron.uhabits.core.commands.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.models.memory.*; +import org.isoron.uhabits.core.tasks.*; +import org.isoron.uhabits.core.test.*; +import org.isoron.uhabits.core.utils.*; +import org.junit.*; +import org.junit.runner.*; +import org.mockito.junit.*; + +import java.util.*; + +import static org.mockito.Mockito.*; + +@RunWith(MockitoJUnitRunner.class) +public class BaseAndroidUnitTest +{ + protected HabitList habitList; + + protected HabitFixtures fixtures; + + protected MemoryModelFactory modelFactory; + + protected SingleThreadTaskRunner taskRunner; + + protected CommandRunner commandRunner; + + @Before + public void setUp() + { + long fixed_local_time = 1422172800000L; + DateUtils.setFixedLocalTime(fixed_local_time); + + modelFactory = new MemoryModelFactory(); + habitList = spy(modelFactory.buildHabitList()); + fixtures = new HabitFixtures(modelFactory); + taskRunner = new SingleThreadTaskRunner(); + commandRunner = new CommandRunner(taskRunner); + } + + @After + public void tearDown() + { + DateUtils.setFixedLocalTime(null); + } + + public long timestamp(int year, int month, int day) + { + GregorianCalendar cal = DateUtils.getStartOfTodayCalendar(); + cal.set(year, month, day); + return cal.getTimeInMillis(); + } + + @Test + public void nothing() + { + + } +} diff --git a/app/src/test/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenuTest.java b/uhabits-android/src/test/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenuTest.java similarity index 61% rename from app/src/test/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenuTest.java rename to uhabits-android/src/test/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenuTest.java index c457fe0a7..f0a3d32a5 100644 --- a/app/src/test/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenuTest.java +++ b/uhabits-android/src/test/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenuTest.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,54 +21,38 @@ package org.isoron.uhabits.activities.habits.list; import android.view.*; +import org.isoron.androidbase.activities.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.activities.*; -import org.isoron.uhabits.activities.habits.list.model.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.ui.*; +import org.isoron.uhabits.core.ui.screens.habits.list.*; import org.isoron.uhabits.preferences.*; import org.junit.*; -import org.mockito.*; -import static junit.framework.Assert.*; import static org.mockito.Mockito.*; -public class ListHabitsMenuTest extends BaseUnitTest +public class ListHabitsMenuTest extends BaseAndroidUnitTest { private BaseActivity activity; - private ListHabitsScreen screen; - - private HabitCardListAdapter adapter; - - private Preferences preferences; + private AndroidPreferences preferences; private ThemeSwitcher themeSwitcher; private ListHabitsMenu menu; - private ArgumentCaptor matcherCaptor; + private ListHabitsMenuBehavior behavior; + @Before @Override public void setUp() { - super.setUp(); - activity = mock(BaseActivity.class); - screen = mock(ListHabitsScreen.class); - adapter = mock(HabitCardListAdapter.class); - preferences = mock(Preferences.class); + preferences = mock(AndroidPreferences.class); themeSwitcher = mock(ThemeSwitcher.class); + behavior = mock(ListHabitsMenuBehavior.class); - when(preferences.getShowArchived()).thenReturn(false); - when(preferences.getShowCompleted()).thenReturn(false); - when(themeSwitcher.isNightMode()).thenReturn(false); - - menu = new ListHabitsMenu(activity, screen, adapter, preferences, - themeSwitcher); - - matcherCaptor = ArgumentCaptor.forClass(HabitMatcher.class); - - reset(adapter); + menu = new ListHabitsMenu(activity, preferences, + themeSwitcher, behavior); } @Test @@ -85,84 +69,75 @@ public class ListHabitsMenuTest extends BaseUnitTest when(androidMenu.findItem(R.id.actionHideCompleted)).thenReturn( hideCompletedItem); + when(preferences.getShowArchived()).thenReturn(false); + when(preferences.getShowCompleted()).thenReturn(false); + when(themeSwitcher.isNightMode()).thenReturn(false); + menu.onCreate(androidMenu); + verify(nightModeItem).setChecked(false); verify(hideArchivedItem).setChecked(true); verify(hideCompletedItem).setChecked(true); reset(nightModeItem, hideArchivedItem, hideCompletedItem); + when(preferences.getShowArchived()).thenReturn(true); + when(preferences.getShowCompleted()).thenReturn(true); when(themeSwitcher.isNightMode()).thenReturn(true); + menu.onCreate(androidMenu); + verify(nightModeItem).setChecked(true); + verify(hideArchivedItem).setChecked(false); + verify(hideCompletedItem).setChecked(false); } @Test public void testOnSelected_about() { onItemSelected(R.id.actionAbout); - verify(screen).showAboutScreen(); + verify(behavior).onViewAbout(); } @Test public void testOnSelected_add() { onItemSelected(R.id.actionAdd); - verify(screen).showCreateHabitScreen(); + verify(behavior).onCreateHabit(); } @Test public void testOnSelected_faq() { onItemSelected(R.id.actionFAQ); - verify(screen).showFAQScreen(); + verify(behavior).onViewFAQ(); } @Test public void testOnSelected_nightMode() { onItemSelected(R.id.actionToggleNightMode); - verify(screen).toggleNightMode(); + verify(behavior).onToggleNightMode(); } @Test public void testOnSelected_settings() { onItemSelected(R.id.actionSettings); - verify(screen).showSettingsScreen(); + verify(behavior).onViewSettings(); } @Test public void testOnSelected_showArchived() { onItemSelected(R.id.actionHideArchived); - verify(preferences).setShowArchived(true); - verify(adapter).setFilter(matcherCaptor.capture()); - verify(adapter).refresh(); - assertTrue(matcherCaptor.getValue().isArchivedAllowed()); - reset(adapter); - - onItemSelected(R.id.actionHideArchived); - verify(preferences).setShowArchived(false); - verify(adapter).setFilter(matcherCaptor.capture()); - verify(adapter).refresh(); - assertFalse(matcherCaptor.getValue().isArchivedAllowed()); + verify(behavior).onToggleShowArchived(); } @Test public void testOnSelected_showCompleted() { onItemSelected(R.id.actionHideCompleted); - verify(preferences).setShowCompleted(true); - verify(adapter).setFilter(matcherCaptor.capture()); - verify(adapter).refresh(); - assertTrue(matcherCaptor.getValue().isCompletedAllowed()); - reset(adapter); - - onItemSelected(R.id.actionHideCompleted); - verify(preferences).setShowCompleted(false); - verify(adapter).setFilter(matcherCaptor.capture()); - verify(adapter).refresh(); - assertFalse(matcherCaptor.getValue().isCompletedAllowed()); + verify(behavior).onToggleShowCompleted(); } protected void onItemSelected(int actionId) diff --git a/app/src/test/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreenTest.java b/uhabits-android/src/test/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreenTest.java similarity index 84% rename from app/src/test/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreenTest.java rename to uhabits-android/src/test/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreenTest.java index e292c3b56..a86048c26 100644 --- a/app/src/test/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreenTest.java +++ b/uhabits-android/src/test/java/org/isoron/uhabits/activities/habits/list/ListHabitsScreenTest.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. * @@ -22,27 +22,30 @@ package org.isoron.uhabits.activities.habits.list; import android.content.*; +import org.isoron.androidbase.activities.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.activities.*; import org.isoron.uhabits.activities.common.dialogs.*; -import org.isoron.uhabits.activities.common.dialogs.ColorPickerDialog.*; import org.isoron.uhabits.activities.habits.edit.*; -import org.isoron.uhabits.commands.*; +import org.isoron.uhabits.core.commands.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.ui.*; +import org.isoron.uhabits.core.ui.callbacks.*; import org.isoron.uhabits.intents.*; -import org.isoron.uhabits.models.*; import org.isoron.uhabits.preferences.*; import org.junit.*; import org.junit.runner.*; -import org.junit.runners.*; +import org.mockito.junit.*; + +import java.util.*; import static org.isoron.uhabits.activities.habits.list.ListHabitsScreen.*; -import static org.mockito.Matchers.any; -import static org.mockito.Mockito.anyInt; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.any; import static org.mockito.Mockito.*; import static org.mockito.Mockito.eq; -@RunWith(JUnit4.class) -public class ListHabitsScreenTest extends BaseUnitTest +@RunWith(MockitoJUnitRunner.class) +public class ListHabitsScreenTest { private BaseActivity activity; @@ -68,15 +71,14 @@ public class ListHabitsScreenTest extends BaseUnitTest private ThemeSwitcher themeSwitcher; - private Preferences prefs; + private AndroidPreferences prefs; + + private CommandParser commandParser; @Before - @Override public void setUp() { - super.setUp(); - - activity = mock(BaseActivity.class); + activity = mock(ListHabitsActivity.class); commandRunner = mock(CommandRunner.class); rootView = mock(ListHabitsRootView.class); intentFactory = mock(IntentFactory.class); @@ -84,7 +86,8 @@ public class ListHabitsScreenTest extends BaseUnitTest 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, intentFactory, themeSwitcher, confirmDeleteDialogFactory, @@ -95,7 +98,7 @@ public class ListHabitsScreenTest extends BaseUnitTest controller = mock(ListHabitsController.class); screen.setController(controller); - habit = fixtures.createEmptyHabit(); + habit = mock(Habit.class); intent = mock(Intent.class); } @@ -120,8 +123,7 @@ public class ListHabitsScreenTest extends BaseUnitTest @Test public void testOnCommand() { - Command c = mock(Command.class); - when(c.getExecuteStringId()).thenReturn(R.string.toast_habit_deleted); + Command c = mock(DeleteHabitsCommand.class); screen.onCommandExecuted(c, null); verify(screen).showMessage(R.string.toast_habit_deleted); } @@ -172,12 +174,11 @@ public class ListHabitsScreenTest extends BaseUnitTest @Test public void testShowColorPicker() { - habit.setColor(999); ColorPickerDialog picker = mock(ColorPickerDialog.class); when(colorPickerDialogFactory.create(999)).thenReturn(picker); - OnColorSelectedListener callback = mock(OnColorSelectedListener.class); + OnColorPickedCallback callback = mock(OnColorPickedCallback.class); - screen.showColorPicker(habit, callback); + screen.showColorPicker(999, callback); verify(activity).showDialog(eq(picker), any()); verify(picker).setListener(callback); @@ -186,9 +187,7 @@ public class ListHabitsScreenTest extends BaseUnitTest @Test public void testShowDeleteConfirmationScreen() { - ConfirmDeleteDialog.Callback callback; - callback = mock(ConfirmDeleteDialog.Callback.class); - + OnConfirmedCallback callback = mock(OnConfirmedCallback.class); ConfirmDeleteDialog dialog = mock(ConfirmDeleteDialog.class); when(confirmDeleteDialogFactory.create(callback)).thenReturn(dialog); @@ -202,8 +201,7 @@ public class ListHabitsScreenTest extends BaseUnitTest { EditHabitDialog dialog = mock(EditHabitDialog.class); when(dialogFactory.edit(habit)).thenReturn(dialog); - - screen.showEditHabitScreen(habit); + screen.showEditHabitsScreen(Collections.singletonList(habit)); verify(activity).showDialog(eq(dialog), any()); } @@ -249,10 +247,9 @@ public class ListHabitsScreenTest extends BaseUnitTest } @Test - public void testToggleNightMode() + public void testApplyTheme() { - screen.toggleNightMode(); - verify(themeSwitcher).toggleNightMode(); + screen.applyTheme(); verify(activity).restartWithFade(ListHabitsActivity.class); } } \ No newline at end of file diff --git a/app/src/test/java/org/isoron/uhabits/activities/habits/list/controllers/CheckmarkButtonControllerTest.java b/uhabits-android/src/test/java/org/isoron/uhabits/activities/habits/list/controllers/CheckmarkButtonControllerTest.java similarity index 90% rename from app/src/test/java/org/isoron/uhabits/activities/habits/list/controllers/CheckmarkButtonControllerTest.java rename to uhabits-android/src/test/java/org/isoron/uhabits/activities/habits/list/controllers/CheckmarkButtonControllerTest.java index e9e6375c5..57aa937fa 100644 --- a/app/src/test/java/org/isoron/uhabits/activities/habits/list/controllers/CheckmarkButtonControllerTest.java +++ b/uhabits-android/src/test/java/org/isoron/uhabits/activities/habits/list/controllers/CheckmarkButtonControllerTest.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,13 +21,13 @@ package org.isoron.uhabits.activities.habits.list.controllers; import org.isoron.uhabits.*; import org.isoron.uhabits.activities.habits.list.views.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.preferences.*; import org.junit.*; import static org.mockito.Mockito.*; -public class CheckmarkButtonControllerTest extends BaseUnitTest +public class CheckmarkButtonControllerTest extends BaseAndroidUnitTest { private CheckmarkButtonController controller; @@ -39,7 +39,7 @@ public class CheckmarkButtonControllerTest extends BaseUnitTest private int timestamp; - private Preferences prefs; + private AndroidPreferences prefs; @Override @Before @@ -49,7 +49,7 @@ public class CheckmarkButtonControllerTest extends BaseUnitTest 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/app/src/test/java/org/isoron/uhabits/activities/habits/list/controllers/HabitCardControllerTest.java b/uhabits-android/src/test/java/org/isoron/uhabits/activities/habits/list/controllers/HabitCardControllerTest.java similarity index 89% rename from app/src/test/java/org/isoron/uhabits/activities/habits/list/controllers/HabitCardControllerTest.java rename to uhabits-android/src/test/java/org/isoron/uhabits/activities/habits/list/controllers/HabitCardControllerTest.java index 554716de6..6f639f187 100644 --- a/app/src/test/java/org/isoron/uhabits/activities/habits/list/controllers/HabitCardControllerTest.java +++ b/uhabits-android/src/test/java/org/isoron/uhabits/activities/habits/list/controllers/HabitCardControllerTest.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. * @@ -20,14 +20,14 @@ package org.isoron.uhabits.activities.habits.list.controllers; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.activities.habits.list.views.*; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.utils.*; import org.junit.*; import static org.mockito.Mockito.*; -public class HabitCardControllerTest extends BaseUnitTest +public class HabitCardControllerTest extends BaseAndroidUnitTest { private Habit habit; diff --git a/app/src/test/java/org/isoron/uhabits/activities/habits/list/controllers/HabitCardListControllerTest.java b/uhabits-android/src/test/java/org/isoron/uhabits/activities/habits/list/controllers/HabitCardListControllerTest.java similarity index 95% rename from app/src/test/java/org/isoron/uhabits/activities/habits/list/controllers/HabitCardListControllerTest.java rename to uhabits-android/src/test/java/org/isoron/uhabits/activities/habits/list/controllers/HabitCardListControllerTest.java index d3dc4e898..d1f9d97b9 100644 --- a/app/src/test/java/org/isoron/uhabits/activities/habits/list/controllers/HabitCardListControllerTest.java +++ b/uhabits-android/src/test/java/org/isoron/uhabits/activities/habits/list/controllers/HabitCardListControllerTest.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. * @@ -20,8 +20,8 @@ package org.isoron.uhabits.activities.habits.list.controllers; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; import org.isoron.uhabits.activities.habits.list.model.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.activities.habits.list.views.*; import org.junit.*; @@ -29,7 +29,7 @@ import java.util.*; import static org.mockito.Mockito.*; -public class HabitCardListControllerTest extends BaseUnitTest +public class HabitCardListControllerTest extends BaseAndroidUnitTest { private LinkedList habits; @@ -66,6 +66,7 @@ public class HabitCardListControllerTest extends BaseUnitTest resetMocks(); + when(adapter.getObservable()).thenReturn(new ModelObservable()); this.controller = new HabitCardListController(adapter); controller.setHabitListener(habitListener); controller.setSelectionListener(selectionListener); diff --git a/app/src/test/java/org/isoron/uhabits/activities/habits/list/controllers/package-info.java b/uhabits-android/src/test/java/org/isoron/uhabits/activities/habits/list/controllers/package-info.java similarity index 100% rename from app/src/test/java/org/isoron/uhabits/activities/habits/list/controllers/package-info.java rename to uhabits-android/src/test/java/org/isoron/uhabits/activities/habits/list/controllers/package-info.java diff --git a/app/src/test/java/org/isoron/uhabits/receivers/ReminderControllerTest.java b/uhabits-android/src/test/java/org/isoron/uhabits/receivers/ReminderControllerTest.java similarity index 84% rename from app/src/test/java/org/isoron/uhabits/receivers/ReminderControllerTest.java rename to uhabits-android/src/test/java/org/isoron/uhabits/receivers/ReminderControllerTest.java index aabf6527a..2626a138a 100644 --- a/app/src/test/java/org/isoron/uhabits/receivers/ReminderControllerTest.java +++ b/uhabits-android/src/test/java/org/isoron/uhabits/receivers/ReminderControllerTest.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. * @@ -20,24 +20,25 @@ package org.isoron.uhabits.receivers; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.notifications.*; +import org.isoron.uhabits.core.utils.*; import org.isoron.uhabits.preferences.*; import org.isoron.uhabits.utils.*; import org.junit.*; import static org.mockito.Mockito.*; -public class ReminderControllerTest extends BaseUnitTest +public class ReminderControllerTest extends BaseAndroidUnitTest { private ReminderController controller; private ReminderScheduler reminderScheduler; - private NotificationTray notificationTray; + private AndroidNotificationTray notificationTray; - private Preferences preferences; + private AndroidPreferences preferences; @Override public void setUp() @@ -45,8 +46,8 @@ public class ReminderControllerTest extends BaseUnitTest super.setUp(); reminderScheduler = mock(ReminderScheduler.class); - notificationTray = mock(NotificationTray.class); - preferences = mock(Preferences.class); + notificationTray = mock(AndroidNotificationTray.class); + preferences = mock(AndroidPreferences.class); controller = new ReminderController(reminderScheduler, notificationTray, preferences); diff --git a/app/src/test/java/org/isoron/uhabits/receivers/WidgetControllerTest.java b/uhabits-android/src/test/java/org/isoron/uhabits/receivers/WidgetControllerTest.java similarity index 75% rename from app/src/test/java/org/isoron/uhabits/receivers/WidgetControllerTest.java rename to uhabits-android/src/test/java/org/isoron/uhabits/receivers/WidgetControllerTest.java index b57b41cd7..5cbb3a1a4 100644 --- a/app/src/test/java/org/isoron/uhabits/receivers/WidgetControllerTest.java +++ b/uhabits-android/src/test/java/org/isoron/uhabits/receivers/WidgetControllerTest.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. * @@ -20,20 +20,21 @@ package org.isoron.uhabits.receivers; import org.isoron.uhabits.*; -import org.isoron.uhabits.commands.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.commands.*; +import org.isoron.uhabits.core.models.*; import org.isoron.uhabits.notifications.*; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.ui.widgets.*; +import org.isoron.uhabits.core.utils.*; import org.junit.*; import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.core.IsEqual.*; -import static org.isoron.uhabits.models.Checkmark.*; +import static org.isoron.uhabits.core.models.Checkmark.*; import static org.mockito.Mockito.*; -public class WidgetControllerTest extends BaseUnitTest +public class WidgetControllerTest extends BaseAndroidUnitTest { - private WidgetController controller; + private WidgetBehavior controller; private CommandRunner commandRunner; @@ -41,7 +42,7 @@ public class WidgetControllerTest extends BaseUnitTest private long today; - private NotificationTray notificationTray; + private AndroidNotificationTray notificationTray; @Override public void setUp() @@ -50,16 +51,15 @@ public class WidgetControllerTest extends BaseUnitTest today = DateUtils.getStartOfToday(); habit = fixtures.createEmptyHabit(); - habitList.add(habit); commandRunner = mock(CommandRunner.class); - notificationTray = mock(NotificationTray.class); - controller = new WidgetController(commandRunner, notificationTray); + notificationTray = mock(AndroidNotificationTray.class); + controller = new WidgetBehavior(commandRunner, notificationTray); } @Test public void testOnAddRepetition_whenChecked() throws Exception { - habit.getRepetitions().toggleTimestamp(today); + habit.getRepetitions().toggle(today); int todayValue = habit.getCheckmarks().getTodayValue(); assertThat(todayValue, equalTo(CHECKED_EXPLICITLY)); controller.onAddRepetition(habit, today); @@ -72,18 +72,18 @@ public class WidgetControllerTest extends BaseUnitTest int todayValue = habit.getCheckmarks().getTodayValue(); assertThat(todayValue, equalTo(UNCHECKED)); controller.onAddRepetition(habit, today); - verify(commandRunner).execute(any(), anyLong()); + verify(commandRunner).execute(any(), isNull()); verify(notificationTray).cancel(habit); } @Test public void testOnRemoveRepetition_whenChecked() throws Exception { - habit.getRepetitions().toggleTimestamp(today); + habit.getRepetitions().toggle(today); int todayValue = habit.getCheckmarks().getTodayValue(); assertThat(todayValue, equalTo(CHECKED_EXPLICITLY)); controller.onRemoveRepetition(habit, today); - verify(commandRunner).execute(any(), anyLong()); + verify(commandRunner).execute(any(), isNull()); } @Test @@ -99,6 +99,6 @@ public class WidgetControllerTest extends BaseUnitTest public void testOnToggleRepetition() throws Exception { controller.onToggleRepetition(habit, today); - verify(commandRunner).execute(any(), anyLong()); + verify(commandRunner).execute(any(), isNull()); } } \ No newline at end of file diff --git a/uhabits-core/.gitignore b/uhabits-core/.gitignore new file mode 100644 index 000000000..796b96d1c --- /dev/null +++ b/uhabits-core/.gitignore @@ -0,0 +1 @@ +/build diff --git a/uhabits-core/build.gradle b/uhabits-core/build.gradle new file mode 100644 index 000000000..47f7cc009 --- /dev/null +++ b/uhabits-core/build.gradle @@ -0,0 +1,50 @@ +plugins { + id "net.ltgt.apt" version "0.7" +} +apply plugin: 'idea' +apply plugin: 'java' +apply plugin: 'jacoco' + +dependencies { + + apt 'com.google.auto.factory:auto-factory:1.0-beta3' + apt 'com.google.dagger:dagger:2.11-rc2' + + compileOnly 'javax.annotation:jsr250-api:1.0' + compileOnly 'com.google.auto.factory:auto-factory:1.0-beta3' + compileOnly 'com.google.dagger:dagger:2.11-rc2' + + implementation 'com.android.support:support-annotations:25.3.1' + implementation 'com.google.code.findbugs:jsr305:3.0.2' + implementation 'org.apache.commons:commons-lang3:3.5' + implementation 'com.google.code.gson:gson:2.7' + + 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' + + implementation ('com.opencsv:opencsv:3.9') { + exclude group: 'commons-logging', module: 'commons-logging' + } + compile 'junit:junit:4.12' +} + +jacocoTestReport { + reports { + xml.enabled = true + html.enabled = true + } + + afterEvaluate { + classDirectories = files(classDirectories.files.collect { + fileTree(dir: it, exclude: '**/*Factory.*') + }) + } +} + +check.dependsOn jacocoTestReport + +sourceCompatibility = "1.8" +targetCompatibility = "1.8" diff --git a/app/src/main/java/org/isoron/uhabits/AppScope.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/AppScope.java similarity index 96% rename from app/src/main/java/org/isoron/uhabits/AppScope.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/AppScope.java index 75c59577a..0aa1b9b52 100644 --- a/app/src/main/java/org/isoron/uhabits/AppScope.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/AppScope.java @@ -17,7 +17,7 @@ * with this program. If not, see . */ -package org.isoron.uhabits; +package org.isoron.uhabits.core; import javax.inject.*; diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/list/model/package-info.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/MyClass.java similarity index 74% rename from app/src/main/java/org/isoron/uhabits/activities/habits/list/model/package-info.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/MyClass.java index 755ffcaa1..dd5cdb01d 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/model/package-info.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/MyClass.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. * @@ -17,7 +17,7 @@ * with this program. If not, see . */ -/** - * Provides models that are specific for {@link org.isoron.uhabits.activities.habits.list.ListHabitsActivity}. - */ -package org.isoron.uhabits.activities.habits.list.model; \ No newline at end of file +package org.isoron.uhabits.core; + +public class MyClass +{} diff --git a/app/src/main/java/org/isoron/uhabits/commands/ArchiveHabitsCommand.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/ArchiveHabitsCommand.java similarity index 88% rename from app/src/main/java/org/isoron/uhabits/commands/ArchiveHabitsCommand.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/commands/ArchiveHabitsCommand.java index 1d508356f..47433650e 100644 --- a/app/src/main/java/org/isoron/uhabits/commands/ArchiveHabitsCommand.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/ArchiveHabitsCommand.java @@ -17,12 +17,11 @@ * with this program. If not, see . */ -package org.isoron.uhabits.commands; +package org.isoron.uhabits.core.commands; import android.support.annotation.*; -import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import java.util.*; @@ -50,16 +49,11 @@ public class ArchiveHabitsCommand extends Command habitList.update(selected); } + @NonNull @Override - public Integer getExecuteStringId() - { - return R.string.toast_habit_archived; - } - - @Override - public Integer getUndoStringId() + public Record toRecord() { - return R.string.toast_habit_unarchived; + return new Record(this); } @Override @@ -69,13 +63,6 @@ public class ArchiveHabitsCommand extends Command habitList.update(selected); } - @NonNull - @Override - public Record toRecord() - { - return new Record(this); - } - public static class Record { @NonNull diff --git a/app/src/main/java/org/isoron/uhabits/commands/ChangeHabitColorCommand.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/ChangeHabitColorCommand.java similarity index 90% rename from app/src/main/java/org/isoron/uhabits/commands/ChangeHabitColorCommand.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/commands/ChangeHabitColorCommand.java index ab1e4b7e3..36ffe7945 100644 --- a/app/src/main/java/org/isoron/uhabits/commands/ChangeHabitColorCommand.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/ChangeHabitColorCommand.java @@ -17,12 +17,11 @@ * with this program. If not, see . */ -package org.isoron.uhabits.commands; +package org.isoron.uhabits.core.commands; import android.support.annotation.*; -import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import java.util.*; @@ -61,18 +60,6 @@ public class ChangeHabitColorCommand extends Command habitList.update(selected); } - @Override - public Integer getExecuteStringId() - { - return R.string.toast_habit_changed; - } - - @Override - public Integer getUndoStringId() - { - return R.string.toast_habit_changed; - } - @NonNull @Override public Record toRecord() diff --git a/app/src/main/java/org/isoron/uhabits/commands/Command.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/Command.java similarity index 77% rename from app/src/main/java/org/isoron/uhabits/commands/Command.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/commands/Command.java index 6059845e9..7d48754ba 100644 --- a/app/src/main/java/org/isoron/uhabits/commands/Command.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/Command.java @@ -17,14 +17,13 @@ * with this program. If not, see . */ -package org.isoron.uhabits.commands; +package org.isoron.uhabits.core.commands; import android.support.annotation.*; import com.google.gson.*; -import org.isoron.uhabits.utils.*; -import org.json.*; +import org.isoron.uhabits.core.utils.*; /** * A Command represents a desired set of changes that should be performed on the @@ -43,7 +42,7 @@ public abstract class Command public Command() { - id = DatabaseUtils.getRandomId(); + id = StringUtils.getRandomId(); isRemote = false; } @@ -55,11 +54,6 @@ public abstract class Command public abstract void execute(); - public Integer getExecuteStringId() - { - return null; - } - public String getId() { return id; @@ -70,11 +64,6 @@ public abstract class Command this.id = id; } - public Integer getUndoStringId() - { - return null; - } - public boolean isRemote() { return isRemote; @@ -86,17 +75,9 @@ public abstract class Command } @NonNull - public JSONObject toJson() + public String toJson() { - try - { - String json = new GsonBuilder().create().toJson(toRecord()); - return new JSONObject(json); - } - catch (JSONException e) - { - throw new RuntimeException(e); - } + return new GsonBuilder().create().toJson(toRecord()); } @NonNull diff --git a/app/src/main/java/org/isoron/uhabits/commands/CommandParser.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/CommandParser.java similarity index 71% rename from app/src/main/java/org/isoron/uhabits/commands/CommandParser.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/commands/CommandParser.java index 1adf190a4..da7d24678 100644 --- a/app/src/main/java/org/isoron/uhabits/commands/CommandParser.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/CommandParser.java @@ -17,14 +17,13 @@ * with this program. If not, see . */ -package org.isoron.uhabits.commands; +package org.isoron.uhabits.core.commands; import android.support.annotation.*; import com.google.gson.*; -import org.isoron.uhabits.models.*; -import org.json.*; +import org.isoron.uhabits.core.models.*; import javax.inject.*; @@ -43,41 +42,42 @@ public class CommandParser } @NonNull - public Command parse(@NonNull JSONObject json) throws JSONException + public Command parse(@NonNull String json) { - String event = json.getString("event"); + JsonObject parsed = new JsonParser().parse(json).getAsJsonObject(); + String event = parsed.get("event").getAsString(); Gson gson = new GsonBuilder().create(); if (event.equals("Archive")) return gson - .fromJson(json.toString(), ArchiveHabitsCommand.Record.class) + .fromJson(json, ArchiveHabitsCommand.Record.class) .toCommand(habitList); if (event.equals("ChangeColor")) return gson - .fromJson(json.toString(), ChangeHabitColorCommand.Record.class) + .fromJson(json, ChangeHabitColorCommand.Record.class) .toCommand(habitList); if (event.equals("CreateHabit")) return gson - .fromJson(json.toString(), CreateHabitCommand.Record.class) + .fromJson(json, CreateHabitCommand.Record.class) .toCommand(modelFactory, habitList); if (event.equals("CreateRep")) return gson - .fromJson(json.toString(), CreateRepetitionCommand.Record.class) + .fromJson(json, CreateRepetitionCommand.Record.class) .toCommand(habitList); if (event.equals("DeleteHabit")) return gson - .fromJson(json.toString(), DeleteHabitsCommand.Record.class) + .fromJson(json, DeleteHabitsCommand.Record.class) .toCommand(habitList); if (event.equals("EditHabit")) return gson - .fromJson(json.toString(), EditHabitCommand.Record.class) + .fromJson(json, EditHabitCommand.Record.class) .toCommand(modelFactory, habitList); if (event.equals("Toggle")) return gson - .fromJson(json.toString(), ToggleRepetitionCommand.Record.class) + .fromJson(json, ToggleRepetitionCommand.Record.class) .toCommand(habitList); if (event.equals("Unarchive")) return gson - .fromJson(json.toString(), UnarchiveHabitsCommand.Record.class) + .fromJson(json, UnarchiveHabitsCommand.Record.class) .toCommand(habitList); throw new IllegalStateException("Unknown command"); diff --git a/app/src/main/java/org/isoron/uhabits/commands/CommandRunner.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/CommandRunner.java similarity index 95% rename from app/src/main/java/org/isoron/uhabits/commands/CommandRunner.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/commands/CommandRunner.java index 8ef46f6ec..6cac8a364 100644 --- a/app/src/main/java/org/isoron/uhabits/commands/CommandRunner.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/CommandRunner.java @@ -17,12 +17,12 @@ * with this program. If not, see . */ -package org.isoron.uhabits.commands; +package org.isoron.uhabits.core.commands; import android.support.annotation.*; -import org.isoron.uhabits.*; -import org.isoron.uhabits.tasks.*; +import org.isoron.uhabits.core.*; +import org.isoron.uhabits.core.tasks.*; import java.util.*; diff --git a/app/src/main/java/org/isoron/uhabits/commands/CreateHabitCommand.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/CreateHabitCommand.java similarity index 89% rename from app/src/main/java/org/isoron/uhabits/commands/CreateHabitCommand.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/commands/CreateHabitCommand.java index c0800b8e6..e5f8f15be 100644 --- a/app/src/main/java/org/isoron/uhabits/commands/CreateHabitCommand.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/CreateHabitCommand.java @@ -17,14 +17,13 @@ * with this program. If not, see . */ -package org.isoron.uhabits.commands; +package org.isoron.uhabits.core.commands; import android.support.annotation.*; import com.google.auto.factory.*; -import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; /** * Command to create a habit. @@ -62,18 +61,6 @@ public class CreateHabitCommand extends Command savedId = savedHabit.getId(); } - @Override - public Integer getExecuteStringId() - { - return R.string.toast_habit_created; - } - - @Override - public Integer getUndoStringId() - { - return R.string.toast_habit_deleted; - } - @NonNull @Override public Record toRecord() diff --git a/app/src/main/java/org/isoron/uhabits/commands/CreateRepetitionCommand.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/CreateRepetitionCommand.java similarity index 97% rename from app/src/main/java/org/isoron/uhabits/commands/CreateRepetitionCommand.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/commands/CreateRepetitionCommand.java index ddebd1073..9264a9c90 100644 --- a/app/src/main/java/org/isoron/uhabits/commands/CreateRepetitionCommand.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/CreateRepetitionCommand.java @@ -17,11 +17,11 @@ * with this program. If not, see . */ -package org.isoron.uhabits.commands; +package org.isoron.uhabits.core.commands; import android.support.annotation.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; /** * Command to toggle a repetition. diff --git a/app/src/main/java/org/isoron/uhabits/commands/DeleteHabitsCommand.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/DeleteHabitsCommand.java similarity index 88% rename from app/src/main/java/org/isoron/uhabits/commands/DeleteHabitsCommand.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/commands/DeleteHabitsCommand.java index fbc74c257..1a99aa723 100644 --- a/app/src/main/java/org/isoron/uhabits/commands/DeleteHabitsCommand.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/DeleteHabitsCommand.java @@ -17,12 +17,11 @@ * with this program. If not, see . */ -package org.isoron.uhabits.commands; +package org.isoron.uhabits.core.commands; import android.support.annotation.*; -import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import java.util.*; @@ -52,23 +51,11 @@ public class DeleteHabitsCommand extends Command habitList.remove(h); } - @Override - public Integer getExecuteStringId() - { - return R.string.toast_habit_deleted; - } - public List getSelected() { return Collections.unmodifiableList(selected); } - @Override - public Integer getUndoStringId() - { - return R.string.toast_habit_restored; - } - @Override @NonNull public Record toRecord() diff --git a/app/src/main/java/org/isoron/uhabits/commands/EditHabitCommand.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/EditHabitCommand.java similarity index 92% rename from app/src/main/java/org/isoron/uhabits/commands/EditHabitCommand.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/commands/EditHabitCommand.java index 0f4ccb6aa..2870f4400 100644 --- a/app/src/main/java/org/isoron/uhabits/commands/EditHabitCommand.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/EditHabitCommand.java @@ -17,14 +17,13 @@ * with this program. If not, see . */ -package org.isoron.uhabits.commands; +package org.isoron.uhabits.core.commands; import android.support.annotation.*; import com.google.auto.factory.*; -import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; /** * Command to modify a habit. @@ -77,18 +76,6 @@ public class EditHabitCommand extends Command copyAttributes(this.modified); } - @Override - public Integer getExecuteStringId() - { - return R.string.toast_habit_changed; - } - - @Override - public Integer getUndoStringId() - { - return R.string.toast_habit_changed_back; - } - @NonNull @Override public Record toRecord() diff --git a/app/src/main/java/org/isoron/uhabits/commands/ToggleRepetitionCommand.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/ToggleRepetitionCommand.java similarity index 94% rename from app/src/main/java/org/isoron/uhabits/commands/ToggleRepetitionCommand.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/commands/ToggleRepetitionCommand.java index 556bf3e14..bc9e4b391 100644 --- a/app/src/main/java/org/isoron/uhabits/commands/ToggleRepetitionCommand.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/ToggleRepetitionCommand.java @@ -17,11 +17,11 @@ * with this program. If not, see . */ -package org.isoron.uhabits.commands; +package org.isoron.uhabits.core.commands; import android.support.annotation.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; /** * Command to toggle a repetition. @@ -43,7 +43,7 @@ public class ToggleRepetitionCommand extends Command @Override public void execute() { - habit.getRepetitions().toggleTimestamp(timestamp); + habit.getRepetitions().toggle(timestamp); } @NonNull diff --git a/app/src/main/java/org/isoron/uhabits/commands/UnarchiveHabitsCommand.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/UnarchiveHabitsCommand.java similarity index 88% rename from app/src/main/java/org/isoron/uhabits/commands/UnarchiveHabitsCommand.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/commands/UnarchiveHabitsCommand.java index d66425348..af260d3bb 100644 --- a/app/src/main/java/org/isoron/uhabits/commands/UnarchiveHabitsCommand.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/UnarchiveHabitsCommand.java @@ -17,12 +17,11 @@ * with this program. If not, see . */ -package org.isoron.uhabits.commands; +package org.isoron.uhabits.core.commands; import android.support.annotation.*; -import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import java.util.*; @@ -51,18 +50,6 @@ public class UnarchiveHabitsCommand extends Command habitList.update(selected); } - @Override - public Integer getExecuteStringId() - { - return R.string.toast_habit_unarchived; - } - - @Override - public Integer getUndoStringId() - { - return R.string.toast_habit_archived; - } - @Override @NonNull public Record toRecord() diff --git a/app/src/main/java/org/isoron/uhabits/commands/package-info.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/package-info.java similarity index 89% rename from app/src/main/java/org/isoron/uhabits/commands/package-info.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/commands/package-info.java index 8fce85ae1..848a9e284 100644 --- a/app/src/main/java/org/isoron/uhabits/commands/package-info.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/commands/package-info.java @@ -19,6 +19,6 @@ /** * Provides commands to modify the models, such as {@link - * org.isoron.uhabits.commands.CreateHabitCommand}. + * org.isoron.uhabits.core.commands.CreateHabitCommand}. */ -package org.isoron.uhabits.commands; \ No newline at end of file +package org.isoron.uhabits.core.commands; \ No newline at end of file diff --git a/app/src/main/java/org/isoron/uhabits/io/HabitsCSVExporter.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/io/HabitsCSVExporter.java similarity index 98% rename from app/src/main/java/org/isoron/uhabits/io/HabitsCSVExporter.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/io/HabitsCSVExporter.java index d89413d2f..9665332fe 100644 --- a/app/src/main/java/org/isoron/uhabits/io/HabitsCSVExporter.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/io/HabitsCSVExporter.java @@ -17,12 +17,12 @@ * with this program. If not, see . */ -package org.isoron.uhabits.io; +package org.isoron.uhabits.core.io; import android.support.annotation.*; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.utils.*; import java.io.*; import java.text.*; diff --git a/app/src/main/java/org/isoron/uhabits/models/Checkmark.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Checkmark.java similarity index 98% rename from app/src/main/java/org/isoron/uhabits/models/Checkmark.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/models/Checkmark.java index 85084c743..1075d4b4a 100644 --- a/app/src/main/java/org/isoron/uhabits/models/Checkmark.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Checkmark.java @@ -17,7 +17,7 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models; +package org.isoron.uhabits.core.models; import org.apache.commons.lang3.builder.*; diff --git a/app/src/main/java/org/isoron/uhabits/models/CheckmarkList.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/CheckmarkList.java similarity index 97% rename from app/src/main/java/org/isoron/uhabits/models/CheckmarkList.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/models/CheckmarkList.java index cd34be198..847775127 100644 --- a/app/src/main/java/org/isoron/uhabits/models/CheckmarkList.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/CheckmarkList.java @@ -17,19 +17,19 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models; +package org.isoron.uhabits.core.models; import android.support.annotation.*; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.utils.*; import java.io.*; import java.text.*; import java.util.*; -import static org.isoron.uhabits.models.Checkmark.CHECKED_EXPLICITLY; -import static org.isoron.uhabits.models.Checkmark.CHECKED_IMPLICITLY; import javax.annotation.concurrent.*; + +import static org.isoron.uhabits.core.models.Checkmark.*; /** * The collection of {@link Checkmark}s belonging to a habit. */ diff --git a/app/src/main/java/org/isoron/uhabits/models/Frequency.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Frequency.java similarity index 98% rename from app/src/main/java/org/isoron/uhabits/models/Frequency.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/models/Frequency.java index b21349b18..d12ff8ad2 100644 --- a/app/src/main/java/org/isoron/uhabits/models/Frequency.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Frequency.java @@ -17,7 +17,7 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models; +package org.isoron.uhabits.core.models; import org.apache.commons.lang3.builder.*; diff --git a/app/src/main/java/org/isoron/uhabits/models/Habit.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Habit.java similarity index 96% rename from app/src/main/java/org/isoron/uhabits/models/Habit.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/models/Habit.java index 90b760609..15c0aba07 100644 --- a/app/src/main/java/org/isoron/uhabits/models/Habit.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Habit.java @@ -17,9 +17,8 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models; +package org.isoron.uhabits.core.models; -import android.net.*; import android.support.annotation.*; import org.apache.commons.lang3.builder.*; @@ -29,7 +28,7 @@ import java.util.*; import javax.annotation.concurrent.*; import javax.inject.*; -import static org.isoron.uhabits.models.Checkmark.*; +import static org.isoron.uhabits.core.models.Checkmark.*; /** * The thing that the user wants to track. @@ -281,12 +280,11 @@ public class Habit /** * Returns the public URI that identifies this habit * - * @return the uri + * @return the URI */ - public Uri getUri() + public String getUriString() { - String s = String.format(Locale.US, HABIT_URI_FORMAT, getId()); - return Uri.parse(s); + return String.format(Locale.US, HABIT_URI_FORMAT, getId()); } public synchronized boolean hasId() @@ -324,7 +322,13 @@ public class Habit public synchronized boolean isCompletedToday() { int todayCheckmark = getCheckmarks().getTodayValue(); - if (isNumerical()) return todayCheckmark >= data.targetValue; + if (isNumerical()) + { + if(getTargetType() == AT_LEAST) + return todayCheckmark >= data.targetValue; + else + return todayCheckmark <= data.targetValue; + } else return (todayCheckmark != UNCHECKED); } diff --git a/app/src/main/java/org/isoron/uhabits/models/HabitList.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/HabitList.java similarity index 97% rename from app/src/main/java/org/isoron/uhabits/models/HabitList.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/models/HabitList.java index 2892a2c30..cf49b4ba0 100644 --- a/app/src/main/java/org/isoron/uhabits/models/HabitList.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/HabitList.java @@ -17,13 +17,13 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models; +package org.isoron.uhabits.core.models; import android.support.annotation.*; import com.opencsv.*; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.utils.*; import java.io.*; import java.util.*; @@ -230,7 +230,7 @@ public abstract class HabitList implements Iterable habit.getDescription(), Integer.toString(freq.getNumerator()), Integer.toString(freq.getDenominator()), - ColorUtils.CSV_PALETTE[habit.getColor()] + ColorConstants.CSV_PALETTE[habit.getColor()] }; csv.writeNext(cols, false); diff --git a/app/src/main/java/org/isoron/uhabits/models/HabitMatcher.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/HabitMatcher.java similarity index 98% rename from app/src/main/java/org/isoron/uhabits/models/HabitMatcher.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/models/HabitMatcher.java index 17198f279..d3d536b04 100644 --- a/app/src/main/java/org/isoron/uhabits/models/HabitMatcher.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/HabitMatcher.java @@ -17,7 +17,7 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models; +package org.isoron.uhabits.core.models; import android.support.annotation.*; diff --git a/app/src/main/java/org/isoron/uhabits/models/HabitMatcherBuilder.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/HabitMatcherBuilder.java similarity index 93% rename from app/src/main/java/org/isoron/uhabits/models/HabitMatcherBuilder.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/models/HabitMatcherBuilder.java index facc8cc4b..68a9daf8b 100644 --- a/app/src/main/java/org/isoron/uhabits/models/HabitMatcherBuilder.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/HabitMatcherBuilder.java @@ -17,9 +17,9 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models; +package org.isoron.uhabits.core.models; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.utils.*; import java.util.*; @@ -36,7 +36,7 @@ public class HabitMatcherBuilder private static List allColors() { List colors = new ArrayList<>(); - for(int i = 0; i < ColorUtils.CSV_PALETTE.length; i++) + for(int i = 0; i < ColorConstants.CSV_PALETTE.length; i++) colors.add(i); return colors; } diff --git a/app/src/main/java/org/isoron/uhabits/models/HabitNotFoundException.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/HabitNotFoundException.java similarity index 96% rename from app/src/main/java/org/isoron/uhabits/models/HabitNotFoundException.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/models/HabitNotFoundException.java index 74302e2ad..c40204a1e 100644 --- a/app/src/main/java/org/isoron/uhabits/models/HabitNotFoundException.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/HabitNotFoundException.java @@ -17,7 +17,7 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models; +package org.isoron.uhabits.core.models; public class HabitNotFoundException extends RuntimeException { public HabitNotFoundException() { diff --git a/app/src/main/java/org/isoron/uhabits/models/ModelFactory.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/ModelFactory.java similarity index 97% rename from app/src/main/java/org/isoron/uhabits/models/ModelFactory.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/models/ModelFactory.java index 2556b9755..5c6a548c1 100644 --- a/app/src/main/java/org/isoron/uhabits/models/ModelFactory.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/ModelFactory.java @@ -17,7 +17,7 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models; +package org.isoron.uhabits.core.models; /** * Interface implemented by factories that provide concrete implementations of diff --git a/app/src/main/java/org/isoron/uhabits/models/ModelObservable.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/ModelObservable.java similarity index 98% rename from app/src/main/java/org/isoron/uhabits/models/ModelObservable.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/models/ModelObservable.java index 6ab80813b..7d8f94377 100644 --- a/app/src/main/java/org/isoron/uhabits/models/ModelObservable.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/ModelObservable.java @@ -17,7 +17,7 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models; +package org.isoron.uhabits.core.models; import java.util.*; diff --git a/app/src/main/java/org/isoron/uhabits/models/Reminder.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Reminder.java similarity index 97% rename from app/src/main/java/org/isoron/uhabits/models/Reminder.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/models/Reminder.java index 88d54e293..3fb0bd1b9 100644 --- a/app/src/main/java/org/isoron/uhabits/models/Reminder.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Reminder.java @@ -17,7 +17,7 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models; +package org.isoron.uhabits.core.models; import android.support.annotation.*; diff --git a/app/src/main/java/org/isoron/uhabits/models/Repetition.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Repetition.java similarity index 98% rename from app/src/main/java/org/isoron/uhabits/models/Repetition.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/models/Repetition.java index 274fe3517..3d04328d0 100644 --- a/app/src/main/java/org/isoron/uhabits/models/Repetition.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Repetition.java @@ -17,7 +17,7 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models; +package org.isoron.uhabits.core.models; import org.apache.commons.lang3.builder.*; diff --git a/app/src/main/java/org/isoron/uhabits/models/RepetitionList.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/RepetitionList.java similarity index 91% rename from app/src/main/java/org/isoron/uhabits/models/RepetitionList.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/models/RepetitionList.java index ec355267c..db1346cb7 100644 --- a/app/src/main/java/org/isoron/uhabits/models/RepetitionList.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/RepetitionList.java @@ -17,11 +17,11 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models; +package org.isoron.uhabits.core.models; import android.support.annotation.*; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.utils.*; import java.util.*; @@ -107,6 +107,7 @@ public abstract class RepetitionList */ @Nullable public abstract Repetition getOldest(); + @Nullable /** * Returns the newest repetition in the list. @@ -184,8 +185,11 @@ public abstract class RepetitionList * @return the repetition that has been added or removed. */ @NonNull - public Repetition toggleTimestamp(long timestamp) + public Repetition toggle(long timestamp) { + if(habit.isNumerical()) + throw new IllegalStateException("habit must NOT be numerical"); + timestamp = DateUtils.getStartOfDay(timestamp); Repetition rep = getByTimestamp(timestamp); @@ -207,4 +211,15 @@ public abstract class RepetitionList */ @NonNull public abstract long getTotalCount(); + + public void toggle(long timestamp, int value) + { + if(!habit.isNumerical()) + throw new IllegalStateException("habit must be numerical"); + + Repetition rep = getByTimestamp(timestamp); + if(rep != null) remove(rep); + add(new Repetition(timestamp, value)); + habit.invalidateNewerThan(timestamp); + } } diff --git a/app/src/main/java/org/isoron/uhabits/models/Score.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Score.java similarity index 98% rename from app/src/main/java/org/isoron/uhabits/models/Score.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/models/Score.java index fcfc8b56a..71739f34a 100644 --- a/app/src/main/java/org/isoron/uhabits/models/Score.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Score.java @@ -17,7 +17,7 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models; +package org.isoron.uhabits.core.models; import org.apache.commons.lang3.builder.*; diff --git a/app/src/main/java/org/isoron/uhabits/models/ScoreList.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/ScoreList.java similarity index 99% rename from app/src/main/java/org/isoron/uhabits/models/ScoreList.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/models/ScoreList.java index 1afb19be2..229959fca 100644 --- a/app/src/main/java/org/isoron/uhabits/models/ScoreList.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/ScoreList.java @@ -17,11 +17,11 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models; +package org.isoron.uhabits.core.models; import android.support.annotation.*; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.utils.*; import java.io.*; import java.text.*; diff --git a/app/src/main/java/org/isoron/uhabits/models/Streak.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Streak.java similarity index 95% rename from app/src/main/java/org/isoron/uhabits/models/Streak.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/models/Streak.java index 5a7a59f3d..aff58c180 100644 --- a/app/src/main/java/org/isoron/uhabits/models/Streak.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/Streak.java @@ -17,10 +17,10 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models; +package org.isoron.uhabits.core.models; import org.apache.commons.lang3.builder.*; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.utils.*; public final class Streak { diff --git a/app/src/main/java/org/isoron/uhabits/models/StreakList.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/StreakList.java similarity index 98% rename from app/src/main/java/org/isoron/uhabits/models/StreakList.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/models/StreakList.java index 1176aa71c..ae2bc3032 100644 --- a/app/src/main/java/org/isoron/uhabits/models/StreakList.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/StreakList.java @@ -17,11 +17,11 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models; +package org.isoron.uhabits.core.models; import android.support.annotation.*; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.utils.*; import java.util.*; diff --git a/app/src/main/java/org/isoron/uhabits/models/WeekdayList.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/WeekdayList.java similarity index 97% rename from app/src/main/java/org/isoron/uhabits/models/WeekdayList.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/models/WeekdayList.java index f6cbe4560..64aff772f 100644 --- a/app/src/main/java/org/isoron/uhabits/models/WeekdayList.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/WeekdayList.java @@ -17,7 +17,7 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models; +package org.isoron.uhabits.core.models; import java.util.*; diff --git a/app/src/main/java/org/isoron/uhabits/models/memory/MemoryCheckmarkList.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryCheckmarkList.java similarity index 96% rename from app/src/main/java/org/isoron/uhabits/models/memory/MemoryCheckmarkList.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryCheckmarkList.java index 9a566e51f..fb33a168a 100644 --- a/app/src/main/java/org/isoron/uhabits/models/memory/MemoryCheckmarkList.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryCheckmarkList.java @@ -17,11 +17,11 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models.memory; +package org.isoron.uhabits.core.models.memory; import android.support.annotation.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import java.util.*; diff --git a/app/src/main/java/org/isoron/uhabits/models/memory/MemoryHabitList.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryHabitList.java similarity index 96% rename from app/src/main/java/org/isoron/uhabits/models/memory/MemoryHabitList.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryHabitList.java index 32f1982c4..58ec38fe0 100644 --- a/app/src/main/java/org/isoron/uhabits/models/memory/MemoryHabitList.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryHabitList.java @@ -17,15 +17,15 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models.memory; +package org.isoron.uhabits.core.models.memory; import android.support.annotation.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import java.util.*; -import static org.isoron.uhabits.models.HabitList.Order.*; +import static org.isoron.uhabits.core.models.HabitList.Order.*; /** * In-memory implementation of {@link HabitList}. diff --git a/app/src/main/java/org/isoron/uhabits/models/memory/MemoryModelFactory.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryModelFactory.java similarity index 93% rename from app/src/main/java/org/isoron/uhabits/models/memory/MemoryModelFactory.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryModelFactory.java index 0a934d97a..bbb67a1b0 100644 --- a/app/src/main/java/org/isoron/uhabits/models/memory/MemoryModelFactory.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryModelFactory.java @@ -17,10 +17,10 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models.memory; +package org.isoron.uhabits.core.models.memory; -import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.*; +import org.isoron.uhabits.core.models.*; import dagger.*; diff --git a/app/src/main/java/org/isoron/uhabits/models/memory/MemoryRepetitionList.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryRepetitionList.java similarity index 97% rename from app/src/main/java/org/isoron/uhabits/models/memory/MemoryRepetitionList.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryRepetitionList.java index cf1772e0b..2d7c81fea 100644 --- a/app/src/main/java/org/isoron/uhabits/models/memory/MemoryRepetitionList.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryRepetitionList.java @@ -17,11 +17,11 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models.memory; +package org.isoron.uhabits.core.models.memory; import android.support.annotation.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import java.util.*; diff --git a/app/src/main/java/org/isoron/uhabits/models/memory/MemoryScoreList.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryScoreList.java similarity index 96% rename from app/src/main/java/org/isoron/uhabits/models/memory/MemoryScoreList.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryScoreList.java index b4ddc9fec..66e228d3f 100644 --- a/app/src/main/java/org/isoron/uhabits/models/memory/MemoryScoreList.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryScoreList.java @@ -17,11 +17,11 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models.memory; +package org.isoron.uhabits.core.models.memory; import android.support.annotation.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import java.util.*; diff --git a/app/src/main/java/org/isoron/uhabits/models/memory/MemoryStreakList.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryStreakList.java similarity index 94% rename from app/src/main/java/org/isoron/uhabits/models/memory/MemoryStreakList.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryStreakList.java index 31fd3de8d..1cadf75c2 100644 --- a/app/src/main/java/org/isoron/uhabits/models/memory/MemoryStreakList.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/MemoryStreakList.java @@ -17,10 +17,10 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models.memory; +package org.isoron.uhabits.core.models.memory; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.utils.*; import java.util.*; diff --git a/app/src/main/java/org/isoron/uhabits/models/memory/package-info.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/package-info.java similarity index 94% rename from app/src/main/java/org/isoron/uhabits/models/memory/package-info.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/package-info.java index f8272f334..0f45cc6bc 100644 --- a/app/src/main/java/org/isoron/uhabits/models/memory/package-info.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/memory/package-info.java @@ -20,4 +20,4 @@ /** * Provides in-memory implementation of core models. */ -package org.isoron.uhabits.models.memory; \ No newline at end of file +package org.isoron.uhabits.core.models.memory; \ No newline at end of file diff --git a/app/src/main/java/org/isoron/uhabits/models/package-info.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/package-info.java similarity index 87% rename from app/src/main/java/org/isoron/uhabits/models/package-info.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/models/package-info.java index 9cb029b90..baef7f609 100644 --- a/app/src/main/java/org/isoron/uhabits/models/package-info.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/models/package-info.java @@ -18,7 +18,7 @@ */ /** - * Provides core models classes, such as {@link org.isoron.uhabits.models.Habit} - * and {@link org.isoron.uhabits.models.Repetition}. + * Provides core models classes, such as {@link org.isoron.uhabits.core.models.Habit} + * and {@link org.isoron.uhabits.core.models.Repetition}. */ -package org.isoron.uhabits.models; \ No newline at end of file +package org.isoron.uhabits.core.models; \ No newline at end of file diff --git a/uhabits-core/src/main/java/org/isoron/uhabits/core/preferences/Preferences.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/preferences/Preferences.java new file mode 100644 index 000000000..154e06333 --- /dev/null +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/preferences/Preferences.java @@ -0,0 +1,51 @@ +/* + * 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.core.preferences; + +public interface Preferences +{ + int getLastHintNumber(); + + long getLastHintTimestamp(); + + boolean getShowArchived(); + + boolean getShowCompleted(); + + int getTheme(); + + void incrementLaunchCount(); + + boolean isFirstRun(); + + boolean isPureBlackEnabled(); + + void setDeveloper(boolean isDeveloper); + + void setFirstRun(boolean b); + + void setShowArchived(boolean showArchived); + + void setShowCompleted(boolean showCompleted); + + void setTheme(int theme); + + void updateLastHint(int i, long startOfToday); +} diff --git a/app/src/main/java/org/isoron/uhabits/tasks/ExportCSVTask.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/tasks/ExportCSVTask.java similarity index 74% rename from app/src/main/java/org/isoron/uhabits/tasks/ExportCSVTask.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/tasks/ExportCSVTask.java index 1f41f1994..38c2f7f84 100644 --- a/app/src/main/java/org/isoron/uhabits/tasks/ExportCSVTask.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/tasks/ExportCSVTask.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. * @@ -17,18 +17,14 @@ * with this program. If not, see . */ -package org.isoron.uhabits.tasks; +package org.isoron.uhabits.core.tasks; -import android.content.Context; import android.support.annotation.*; import com.google.auto.factory.*; -import org.isoron.uhabits.AppContext; -import org.isoron.uhabits.activities.ActivityContext; -import org.isoron.uhabits.io.*; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.io.*; +import org.isoron.uhabits.core.models.*; import java.io.*; import java.util.*; @@ -38,27 +34,26 @@ public class ExportCSVTask implements Task { private String archiveFilename; - @NonNull - private final Context context; - @NonNull private final List selectedHabits; + private File outputDir; + @NonNull private final ExportCSVTask.Listener listener; @NonNull private final HabitList habitList; - public ExportCSVTask(@Provided @AppContext @NonNull Context context, - @Provided @NonNull HabitList habitList, + public ExportCSVTask(@Provided @NonNull HabitList habitList, @NonNull List selectedHabits, + @NonNull File outputDir, @NonNull Listener listener) { - this.context = context; this.listener = listener; this.habitList = habitList; this.selectedHabits = selectedHabits; + this.outputDir = outputDir; } @Override @@ -66,11 +61,8 @@ public class ExportCSVTask implements Task { try { - File dir = FileUtils.getFilesDir(context, "CSV"); - if (dir == null) return; - HabitsCSVExporter exporter; - exporter = new HabitsCSVExporter(habitList, selectedHabits, dir); + exporter = new HabitsCSVExporter(habitList, selectedHabits, outputDir); archiveFilename = exporter.writeArchive(); } catch (IOException e) diff --git a/app/src/main/java/org/isoron/uhabits/tasks/SingleThreadTaskRunner.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/tasks/SingleThreadTaskRunner.java similarity index 86% rename from app/src/main/java/org/isoron/uhabits/tasks/SingleThreadTaskRunner.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/tasks/SingleThreadTaskRunner.java index db05b0955..748b8521d 100644 --- a/app/src/main/java/org/isoron/uhabits/tasks/SingleThreadTaskRunner.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/tasks/SingleThreadTaskRunner.java @@ -17,22 +17,10 @@ * with this program. If not, see . */ -package org.isoron.uhabits.tasks; +package org.isoron.uhabits.core.tasks; -import org.isoron.uhabits.*; - -import dagger.*; - -@Module public class SingleThreadTaskRunner implements TaskRunner { - @Provides - @AppScope - public static TaskRunner provideTaskRunner() - { - return new SingleThreadTaskRunner(); - } - @Override public void addListener(Listener listener) { diff --git a/app/src/main/java/org/isoron/uhabits/tasks/Task.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/tasks/Task.java similarity index 96% rename from app/src/main/java/org/isoron/uhabits/tasks/Task.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/tasks/Task.java index a1b69098a..3531a6314 100644 --- a/app/src/main/java/org/isoron/uhabits/tasks/Task.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/tasks/Task.java @@ -17,7 +17,7 @@ * with this program. If not, see . */ -package org.isoron.uhabits.tasks; +package org.isoron.uhabits.core.tasks; import android.support.annotation.*; diff --git a/app/src/main/java/org/isoron/uhabits/tasks/TaskRunner.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/tasks/TaskRunner.java similarity index 96% rename from app/src/main/java/org/isoron/uhabits/tasks/TaskRunner.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/tasks/TaskRunner.java index c5c38d7c0..ec2a4486e 100644 --- a/app/src/main/java/org/isoron/uhabits/tasks/TaskRunner.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/tasks/TaskRunner.java @@ -17,7 +17,7 @@ * with this program. If not, see . */ -package org.isoron.uhabits.tasks; +package org.isoron.uhabits.core.tasks; public interface TaskRunner { diff --git a/app/src/test/java/org/isoron/uhabits/models/HabitFixtures.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/test/HabitFixtures.java similarity index 67% rename from app/src/test/java/org/isoron/uhabits/models/HabitFixtures.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/test/HabitFixtures.java index f49db1320..c5450fcb3 100644 --- a/app/src/test/java/org/isoron/uhabits/models/HabitFixtures.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/test/HabitFixtures.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. * @@ -17,9 +17,10 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models; +package org.isoron.uhabits.core.test; -import org.isoron.uhabits.utils.DateUtils; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.utils.*; public class HabitFixtures { @@ -57,7 +58,32 @@ public class HabitFixtures 81, 83, 89, 90, 91, 95, 102, 103, 108, 109, 120}; for (int mark : marks) - habit.getRepetitions().toggleTimestamp(today - mark * day); + habit.getRepetitions().toggle(today - mark * day); + + return habit; + } + + public Habit createNumericalHabit() + { + Habit habit = modelFactory.buildHabit(); + habit.setType(Habit.NUMBER_HABIT); + habit.setName("Run"); + habit.setDescription("How many miles did you run today?"); + habit.setUnit("miles"); + habit.setTargetType(Habit.AT_LEAST); + habit.setTargetValue(2.0); + habit.setColor(1); + + long day = DateUtils.millisecondsInOneDay; + long today = DateUtils.getStartOfToday(); + int times[] = { 0, 1, 3, 5, 7, 8, 9, 10 }; + int values[] = { 100, 200, 300, 400, 500, 600, 700, 800 }; + + for(int i = 0; i < times.length; i++) + { + long timestamp = today - times[i] * day; + habit.getRepetitions().add(new Repetition(timestamp, values[i])); + } return habit; } @@ -72,7 +98,7 @@ public class HabitFixtures long timestamp = DateUtils.getStartOfToday(); for (boolean c : NON_DAILY_HABIT_CHECKS) { - if (c) habit.getRepetitions().toggleTimestamp(timestamp); + if (c) habit.getRepetitions().toggle(timestamp); timestamp -= DateUtils.millisecondsInOneDay; } diff --git a/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/NotificationTray.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/NotificationTray.java new file mode 100644 index 000000000..3a882f465 --- /dev/null +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/NotificationTray.java @@ -0,0 +1,27 @@ +/* + * 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.core.ui; + +import org.isoron.uhabits.core.models.*; + +public interface NotificationTray +{ + void cancel(Habit habit); +} diff --git a/app/src/main/java/org/isoron/uhabits/activities/ThemeSwitcher.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/ThemeSwitcher.java similarity index 50% rename from app/src/main/java/org/isoron/uhabits/activities/ThemeSwitcher.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/ui/ThemeSwitcher.java index d560800ec..b3d6db862 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/ThemeSwitcher.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/ThemeSwitcher.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. * @@ -17,58 +17,52 @@ * with this program. If not, see . */ -package org.isoron.uhabits.activities; +package org.isoron.uhabits.core.ui; import android.support.annotation.*; -import org.isoron.uhabits.*; -import org.isoron.uhabits.preferences.*; +import org.isoron.uhabits.core.preferences.*; -import javax.inject.*; - -@ActivityScope -public class ThemeSwitcher +public abstract class ThemeSwitcher { public static final int THEME_DARK = 1; public static final int THEME_LIGHT = 0; - @NonNull - private final BaseActivity activity; - - private Preferences preferences; + private final Preferences preferences; - @Inject - public ThemeSwitcher(@NonNull BaseActivity activity, - @NonNull Preferences preferences) + public ThemeSwitcher(@NonNull Preferences preferences) { - this.activity = activity; this.preferences = preferences; } public void apply() { - switch (getTheme()) + if (preferences.getTheme() == THEME_DARK) { - case THEME_DARK: - applyDarkTheme(); - break; - - case THEME_LIGHT: - default: - applyLightTheme(); - break; + if (preferences.isPureBlackEnabled()) applyPureBlackTheme(); + else applyDarkTheme(); + } + else + { + applyLightTheme(); } } + public abstract void applyDarkTheme(); + + public abstract void applyLightTheme(); + + public abstract void applyPureBlackTheme(); + public boolean isNightMode() { - return getTheme() == THEME_DARK; + return preferences.getTheme() == THEME_DARK; } - public void refreshTheme() + public void setTheme(int theme) { - + preferences.setTheme(theme); } public void toggleNightMode() @@ -76,26 +70,4 @@ public class ThemeSwitcher if (isNightMode()) setTheme(THEME_LIGHT); else setTheme(THEME_DARK); } - - private void applyDarkTheme() - { - if (preferences.isPureBlackEnabled()) - activity.setTheme(R.style.AppBaseThemeDark_PureBlack); - else activity.setTheme(R.style.AppBaseThemeDark); - } - - private void applyLightTheme() - { - activity.setTheme(R.style.AppBaseTheme); - } - - private int getTheme() - { - return preferences.getTheme(); - } - - public void setTheme(int theme) - { - preferences.setTheme(theme); - } } diff --git a/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/callbacks/OnColorPickedCallback.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/callbacks/OnColorPickedCallback.java new file mode 100644 index 000000000..b435c23c6 --- /dev/null +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/callbacks/OnColorPickedCallback.java @@ -0,0 +1,25 @@ +/* + * 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.core.ui.callbacks; + +public interface OnColorPickedCallback +{ + void onColorPicked(int color); +} diff --git a/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/callbacks/OnConfirmedCallback.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/callbacks/OnConfirmedCallback.java new file mode 100644 index 000000000..3a51f0bca --- /dev/null +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/callbacks/OnConfirmedCallback.java @@ -0,0 +1,25 @@ +/* + * 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.core.ui.callbacks; + +public interface OnConfirmedCallback +{ + void onConfirmed(); +} diff --git a/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/callbacks/OnFinishedCallback.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/callbacks/OnFinishedCallback.java new file mode 100644 index 000000000..6d0bdf8e5 --- /dev/null +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/callbacks/OnFinishedCallback.java @@ -0,0 +1,25 @@ +/* + * 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.core.ui.callbacks; + +public interface OnFinishedCallback +{ + void onFinish(); +} diff --git a/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/about/AboutBehavior.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/about/AboutBehavior.java new file mode 100644 index 000000000..6fc091fad --- /dev/null +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/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.core.ui.screens.about; + +import android.support.annotation.*; + +import org.isoron.uhabits.core.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/app/src/main/java/org/isoron/uhabits/activities/habits/list/model/HabitCardListCache.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/HabitCardListCache.java similarity index 97% rename from app/src/main/java/org/isoron/uhabits/activities/habits/list/model/HabitCardListCache.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/HabitCardListCache.java index 9925be240..08afffcc7 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/model/HabitCardListCache.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/HabitCardListCache.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. * @@ -17,15 +17,15 @@ * with this program. If not, see . */ -package org.isoron.uhabits.activities.habits.list.model; +package org.isoron.uhabits.core.ui.screens.habits.list; 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.utils.*; +import org.isoron.uhabits.core.*; +import org.isoron.uhabits.core.commands.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.tasks.*; +import org.isoron.uhabits.core.utils.*; import java.util.*; diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/list/model/HintList.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/HintList.java similarity index 91% rename from app/src/main/java/org/isoron/uhabits/activities/habits/list/model/HintList.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/HintList.java index 8fa0d6274..56bf7b23f 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/list/model/HintList.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/HintList.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. * @@ -17,14 +17,14 @@ * with this program. If not, see . */ -package org.isoron.uhabits.activities.habits.list.model; +package org.isoron.uhabits.core.ui.screens.habits.list; import android.support.annotation.*; import com.google.auto.factory.*; -import org.isoron.uhabits.preferences.*; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.preferences.*; +import org.isoron.uhabits.core.utils.*; /** * Provides a list of hints to be shown at the application startup, and takes diff --git a/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.java new file mode 100644 index 000000000..890a5c470 --- /dev/null +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehavior.java @@ -0,0 +1,183 @@ +/* + * 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.core.ui.screens.habits.list; + +import android.support.annotation.*; + +import org.isoron.uhabits.core.commands.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.preferences.*; +import org.isoron.uhabits.core.tasks.*; +import org.isoron.uhabits.core.utils.*; + +import java.io.*; +import java.util.*; + +import javax.inject.*; + +public class ListHabitsBehavior +{ + private HabitList habitList; + + private System system; + + private TaskRunner taskRunner; + + private Screen screen; + + private CommandRunner commandRunner; + + private Preferences prefs; + + @Inject + public ListHabitsBehavior(@NonNull HabitList habitList, + @NonNull System system, + @NonNull TaskRunner taskRunner, + @NonNull Screen screen, + @NonNull CommandRunner commandRunner, + @NonNull Preferences prefs) + { + this.habitList = habitList; + this.system = system; + this.taskRunner = taskRunner; + this.screen = screen; + this.commandRunner = commandRunner; + this.prefs = prefs; + } + + public void onClickHabit(@NonNull Habit h) + { + screen.showHabitScreen(h); + } + + public void onEdit(@NonNull Habit habit, long timestamp) + { + CheckmarkList checkmarks = habit.getCheckmarks(); + double oldValue = checkmarks.getValues(timestamp, timestamp)[0]; + + screen.showNumberPicker(oldValue / 1000, habit.getUnit(), newValue -> + { + newValue = Math.round(newValue * 1000); + commandRunner.execute( + new CreateRepetitionCommand(habit, timestamp, (int) newValue), + habit.getId()); + }); + } + + public void onExportCSV() + { + List selected = new LinkedList<>(); + for (Habit h : habitList) selected.add(h); + 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 void onReorderHabit(@NonNull Habit from, @NonNull Habit to) + { + taskRunner.execute(() -> habitList.reorder(from, to)); + } + + public void onRepairDB() + { + taskRunner.execute(() -> + { + habitList.repair(); + screen.showMessage(Message.DATABASE_REPAIRED); + }); + } + + public void onSendBugReport() + { + system.dumpBugReportToFile(); + + try + { + String log = system.getBugReport(); + screen.showSendBugReportToDeveloperScreen(log); + } + catch (IOException e) + { + e.printStackTrace(); + screen.showMessage(Message.COULD_NOT_GENERATE_BUG_REPORT); + } + } + + public void onStartup() + { + prefs.incrementLaunchCount(); + if (prefs.isFirstRun()) onFirstRun(); + } + + public void onToggle(@NonNull Habit habit, long timestamp) + { + commandRunner.execute(new ToggleRepetitionCommand(habit, timestamp), + habit.getId()); + } + + public void onFirstRun() + { + prefs.setFirstRun(false); + prefs.updateLastHint(-1, DateUtils.getStartOfToday()); + screen.showIntroScreen(); + } + + public enum Message + { + COULD_NOT_EXPORT, IMPORT_SUCCESSFUL, IMPORT_FAILED, DATABASE_REPAIRED, + COULD_NOT_GENERATE_BUG_REPORT, FILE_NOT_RECOGNIZED + } + + public interface NumberPickerCallback + { + void onNumberPicked(double newValue); + } + + public interface Screen + { + void showHabitScreen(@NonNull Habit h); + + void showIntroScreen(); + + void showMessage(@NonNull Message m); + + void showNumberPicker(double value, + @NonNull String unit, + @NonNull NumberPickerCallback callback); + + void showSendBugReportToDeveloperScreen(String log); + + void showSendFileScreen(@NonNull String filename); + } + + public interface System + { + void dumpBugReportToFile(); + + String getBugReport() throws IOException; + + File getCSVOutputDir(); + } +} diff --git a/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.java new file mode 100644 index 000000000..ba299158b --- /dev/null +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.java @@ -0,0 +1,154 @@ +/* + * 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.core.ui.screens.habits.list; + +import android.support.annotation.*; + +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.preferences.*; +import org.isoron.uhabits.core.ui.*; + +import javax.inject.*; + +public class ListHabitsMenuBehavior +{ + @NonNull + private final Screen screen; + + @NonNull + private final Adapter adapter; + + @NonNull + private final Preferences preferences; + + @NonNull + private final ThemeSwitcher themeSwitcher; + + private boolean showCompleted; + + private boolean showArchived; + + @Inject + public ListHabitsMenuBehavior(@NonNull Screen screen, + @NonNull Adapter adapter, + @NonNull Preferences preferences, + @NonNull ThemeSwitcher themeSwitcher) + { + this.screen = screen; + this.adapter = adapter; + this.preferences = preferences; + this.themeSwitcher = themeSwitcher; + + showCompleted = preferences.getShowCompleted(); + showArchived = preferences.getShowArchived(); + updateAdapterFilter(); + } + + public void onCreateHabit() + { + screen.showCreateHabitScreen(); + } + + public void onViewFAQ() + { + screen.showFAQScreen(); + } + + public void onViewAbout() + { + screen.showAboutScreen(); + } + + public void onViewSettings() + { + screen.showSettingsScreen(); + } + + public void onToggleShowArchived() + { + showArchived = !showArchived; + preferences.setShowArchived(showArchived); + updateAdapterFilter(); + } + + public void onToggleShowCompleted() + { + showCompleted = !showCompleted; + preferences.setShowCompleted(showCompleted); + updateAdapterFilter(); + } + + public void onSortByColor() + { + adapter.setOrder(HabitList.Order.BY_COLOR); + } + + public void onSortByManually() + { + adapter.setOrder(HabitList.Order.BY_POSITION); + } + + public void onSortByScore() + { + adapter.setOrder(HabitList.Order.BY_SCORE); + } + + public void onSortByName() + { + adapter.setOrder(HabitList.Order.BY_NAME); + } + + public void onToggleNightMode() + { + themeSwitcher.toggleNightMode(); + screen.applyTheme(); + } + + private void updateAdapterFilter() + { + adapter.setFilter(new HabitMatcherBuilder() + .setArchivedAllowed(showArchived) + .setCompletedAllowed(showCompleted) + .build()); + adapter.refresh(); + } + + public interface Adapter + { + void refresh(); + + void setFilter(HabitMatcher build); + + void setOrder(HabitList.Order order); + } + + public interface Screen + { + void applyTheme(); + + void showAboutScreen(); + + void showCreateHabitScreen(); + + void showFAQScreen(); + + void showSettingsScreen(); + } +} diff --git a/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehavior.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehavior.java new file mode 100644 index 000000000..36d21e9ea --- /dev/null +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehavior.java @@ -0,0 +1,143 @@ +/* + * 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.core.ui.screens.habits.list; + +import android.support.annotation.*; + +import org.isoron.uhabits.core.commands.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.ui.callbacks.*; + +import java.util.*; + +import javax.inject.*; + +public class ListHabitsSelectionMenuBehavior +{ + @NonNull + private final Screen screen; + + @NonNull + CommandRunner commandRunner; + + @NonNull + private final Adapter adapter; + + @NonNull + private final HabitList habitList; + + @Inject + public ListHabitsSelectionMenuBehavior(@NonNull HabitList habitList, + @NonNull Screen screen, + @NonNull Adapter adapter, + @NonNull CommandRunner commandRunner) + { + this.habitList = habitList; + this.screen = screen; + this.adapter = adapter; + this.commandRunner = commandRunner; + } + + public boolean canArchive() + { + for (Habit h : adapter.getSelected()) + if (h.isArchived()) return false; + + return true; + } + + public boolean canEdit() + { + return (adapter.getSelected().size() == 1); + } + + public boolean canUnarchive() + { + for (Habit h : adapter.getSelected()) + if (!h.isArchived()) return false; + + return true; + } + + public void onArchiveHabits() + { + commandRunner.execute( + new ArchiveHabitsCommand(habitList, adapter.getSelected()), null); + adapter.clearSelection(); + } + + public void onChangeColor() + { + List selected = adapter.getSelected(); + Habit first = selected.get(0); + + screen.showColorPicker(first.getColor(), selectedColor -> + { + commandRunner.execute( + new ChangeHabitColorCommand(habitList, selected, selectedColor), + null); + adapter.clearSelection(); + }); + } + + public void onDeleteHabits() + { + List selected = adapter.getSelected(); + screen.showDeleteConfirmationScreen(() -> + { + adapter.performRemove(selected); + commandRunner.execute(new DeleteHabitsCommand(habitList, selected), + null); + adapter.clearSelection(); + }); + } + + public void onEditHabits() + { + screen.showEditHabitsScreen(adapter.getSelected()); + } + + public void onUnarchiveHabits() + { + commandRunner.execute( + new UnarchiveHabitsCommand(habitList, adapter.getSelected()), null); + adapter.clearSelection(); + } + + public interface Adapter + { + void clearSelection(); + + List getSelected(); + + void performRemove(List selected); + } + + public interface Screen + { + void showColorPicker(int defaultColor, + @NonNull OnColorPickedCallback callback); + + void showDeleteConfirmationScreen( + @NonNull OnConfirmedCallback callback); + + void showEditHabitsScreen(@NonNull List selected); + } +} diff --git a/app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitController.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/ShowHabitBehavior.java similarity index 59% rename from app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitController.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/ShowHabitBehavior.java index c4a463199..5b319957e 100644 --- a/app/src/main/java/org/isoron/uhabits/activities/habits/show/ShowHabitController.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/ShowHabitBehavior.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. * @@ -17,56 +17,49 @@ * with this program. If not, see . */ -package org.isoron.uhabits.activities.habits.show; +package org.isoron.uhabits.core.ui.screens.habits.show; import android.support.annotation.*; -import org.isoron.uhabits.activities.*; -import org.isoron.uhabits.activities.common.dialogs.*; -import org.isoron.uhabits.commands.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.commands.*; +import org.isoron.uhabits.core.models.*; import javax.inject.*; -@ActivityScope -public class ShowHabitController - implements ShowHabitRootView.Controller, HistoryEditorDialog.Controller +public class ShowHabitBehavior { - @NonNull - private final ShowHabitScreen screen; - @NonNull private final Habit habit; @NonNull private final CommandRunner commandRunner; + @NonNull + private Screen screen; + @Inject - public ShowHabitController(@NonNull ShowHabitScreen screen, - @NonNull CommandRunner commandRunner, - @NonNull Habit habit) + public ShowHabitBehavior(@NonNull CommandRunner commandRunner, + @NonNull Habit habit, + @NonNull Screen screen) { - this.screen = screen; this.habit = habit; this.commandRunner = commandRunner; + this.screen = screen; } - @Override - public void onEditHistoryButtonClick() + public void onEditHistory() { - screen.showEditHistoryDialog(); + screen.showEditHistoryScreen(); } - @Override public void onToggleCheckmark(long timestamp) { commandRunner.execute(new ToggleRepetitionCommand(habit, timestamp), null); } - @Override - public void onToolbarChanged() + public interface Screen { - screen.invalidateToolbar(); + void showEditHistoryScreen(); } } diff --git a/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/ShowHabitMenuBehavior.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/habits/show/ShowHabitMenuBehavior.java new file mode 100644 index 000000000..2c015b4b6 --- /dev/null +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/screens/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.core.ui.screens.habits.show; + +import android.support.annotation.*; + +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.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/app/src/main/java/org/isoron/uhabits/receivers/WidgetController.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/widgets/WidgetBehavior.java similarity index 81% rename from app/src/main/java/org/isoron/uhabits/receivers/WidgetController.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/ui/widgets/WidgetBehavior.java index 5aecbb970..217a7b6bc 100644 --- a/app/src/main/java/org/isoron/uhabits/receivers/WidgetController.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/ui/widgets/WidgetBehavior.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. * @@ -17,18 +17,17 @@ * with this program. If not, see . */ -package org.isoron.uhabits.receivers; +package org.isoron.uhabits.core.ui.widgets; import android.support.annotation.*; -import org.isoron.uhabits.commands.*; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.notifications.*; +import org.isoron.uhabits.core.commands.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.ui.*; import javax.inject.*; -@ReceiverScope -public class WidgetController +public class WidgetBehavior { @NonNull private final CommandRunner commandRunner; @@ -36,8 +35,8 @@ public class WidgetController private NotificationTray notificationTray; @Inject - public WidgetController(@NonNull CommandRunner commandRunner, - @NonNull NotificationTray notificationTray) + public WidgetBehavior(@NonNull CommandRunner commandRunner, + @NonNull NotificationTray notificationTray) { this.commandRunner = commandRunner; this.notificationTray = notificationTray; diff --git a/uhabits-core/src/main/java/org/isoron/uhabits/core/utils/ColorConstants.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/utils/ColorConstants.java new file mode 100644 index 000000000..0f4d97244 --- /dev/null +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/utils/ColorConstants.java @@ -0,0 +1,20 @@ +package org.isoron.uhabits.core.utils; + +public class ColorConstants +{ + public static String[] CSV_PALETTE = { + "#D32F2F", // 0 red + "#E64A19", // 1 orange + "#F9A825", // 2 yellow + "#AFB42B", // 3 light green + "#388E3C", // 4 dark green + "#00897B", // 5 teal + "#00ACC1", // 6 cyan + "#039BE5", // 7 blue + "#5E35B1", // 8 deep purple + "#8E24AA", // 9 purple + "#D81B60", // 10 pink + "#303030", // 11 dark grey + "#aaaaaa" // 12 light grey + }; +} diff --git a/app/src/main/java/org/isoron/uhabits/utils/DateFormats.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/utils/DateFormats.java similarity index 76% rename from app/src/main/java/org/isoron/uhabits/utils/DateFormats.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/utils/DateFormats.java index 779170efe..755fe54e5 100644 --- a/app/src/main/java/org/isoron/uhabits/utils/DateFormats.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/utils/DateFormats.java @@ -17,34 +17,24 @@ * with this program. If not, see . */ -package org.isoron.uhabits.utils; +package org.isoron.uhabits.core.utils; import android.support.annotation.*; import java.text.*; import java.util.*; -import static android.text.format.DateFormat.*; - public class DateFormats { @NonNull - private static SimpleDateFormat fromSkeleton(@NonNull String skeleton, - @NonNull Locale locale) + public static SimpleDateFormat fromSkeleton(@NonNull String skeleton, + @NonNull Locale locale) { SimpleDateFormat df = new SimpleDateFormat(skeleton, locale); df.setTimeZone(TimeZone.getTimeZone("UTC")); return df; } - @NonNull - public static SimpleDateFormat fromSkeleton(@NonNull String skeleton) - { - Locale locale = Locale.getDefault(); - skeleton = getBestDateTimePattern(locale, skeleton); - return fromSkeleton(skeleton, locale); - } - public static SimpleDateFormat getBackupDateFormat() { return fromSkeleton("yyyy-MM-dd HHmmss", Locale.US); diff --git a/app/src/main/java/org/isoron/uhabits/utils/DateUtils.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/utils/DateUtils.java similarity index 82% rename from app/src/main/java/org/isoron/uhabits/utils/DateUtils.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/utils/DateUtils.java index cce452145..59dc12f19 100644 --- a/app/src/main/java/org/isoron/uhabits/utils/DateUtils.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/utils/DateUtils.java @@ -17,12 +17,7 @@ * with this program. If not, see . */ -package org.isoron.uhabits.utils; - -import android.content.*; -import android.text.format.*; - -import org.isoron.uhabits.*; +package org.isoron.uhabits.core.utils; import java.util.*; @@ -54,48 +49,6 @@ public abstract class DateUtils return dayOfWeek + "\n" + dayOfMonth; } - public static String formatTime(Context context, int hours, int minutes) - { - int reminderMilliseconds = (hours * 60 + minutes) * 60 * 1000; - - Date date = new Date(reminderMilliseconds); - java.text.DateFormat df = DateFormat.getTimeFormat(context); - df.setTimeZone(TimeZone.getTimeZone("UTC")); - - return df.format(date); - } - - public static String formatWeekdayList(Context context, boolean weekday[]) - { - String shortDayNames[] = getShortDayNames(); - String longDayNames[] = getLongDayNames(); - StringBuilder buffer = new StringBuilder(); - - int count = 0; - int first = 0; - boolean isFirst = true; - for (int i = 0; i < 7; i++) - { - if (weekday[i]) - { - if (isFirst) first = i; - else buffer.append(", "); - - buffer.append(shortDayNames[i]); - isFirst = false; - count++; - } - } - - if (count == 1) return longDayNames[first]; - if (count == 2 && weekday[0] && weekday[1]) - return context.getString(R.string.weekends); - if (count == 5 && !weekday[0] && !weekday[1]) - return context.getString(R.string.any_weekday); - if (count == 7) return context.getString(R.string.any_day); - return buffer.toString(); - } - public static GregorianCalendar getCalendar(long timestamp) { GregorianCalendar day = diff --git a/app/src/main/java/org/isoron/uhabits/utils/MidnightTimer.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/utils/MidnightTimer.java similarity index 92% rename from app/src/main/java/org/isoron/uhabits/utils/MidnightTimer.java rename to uhabits-core/src/main/java/org/isoron/uhabits/core/utils/MidnightTimer.java index 30021ae71..1ddacdade 100644 --- a/app/src/main/java/org/isoron/uhabits/utils/MidnightTimer.java +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/utils/MidnightTimer.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. * @@ -17,9 +17,9 @@ * with this program. If not, see . */ -package org.isoron.uhabits.utils; +package org.isoron.uhabits.core.utils; -import org.isoron.uhabits.activities.*; +import org.isoron.uhabits.core.*; import java.util.*; import java.util.concurrent.*; @@ -29,7 +29,7 @@ import javax.inject.*; /** * A class that emits events when a new day starts. */ -@ActivityScope +@AppScope public class MidnightTimer { private final List listeners; diff --git a/uhabits-core/src/main/java/org/isoron/uhabits/core/utils/StringUtils.java b/uhabits-core/src/main/java/org/isoron/uhabits/core/utils/StringUtils.java new file mode 100644 index 000000000..2d8b3b7f7 --- /dev/null +++ b/uhabits-core/src/main/java/org/isoron/uhabits/core/utils/StringUtils.java @@ -0,0 +1,31 @@ +/* + * 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.core.utils; + +import java.math.*; +import java.util.*; + +public class StringUtils +{ + public static String getRandomId() + { + return new BigInteger(260, new Random()).toString(32).substring(0, 32); + } +} diff --git a/app/src/test/java/org/isoron/uhabits/BaseUnitTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/BaseUnitTest.java similarity index 67% rename from app/src/test/java/org/isoron/uhabits/BaseUnitTest.java rename to uhabits-core/src/test/java/org/isoron/uhabits/BaseUnitTest.java index 5bd3d841a..0cc34b800 100644 --- a/app/src/test/java/org/isoron/uhabits/BaseUnitTest.java +++ b/uhabits-core/src/test/java/org/isoron/uhabits/BaseUnitTest.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,13 +19,21 @@ package org.isoron.uhabits; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.models.memory.*; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.commands.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.models.memory.*; +import org.isoron.uhabits.core.tasks.*; +import org.isoron.uhabits.core.test.*; +import org.isoron.uhabits.core.utils.*; import org.junit.*; +import org.junit.runner.*; +import org.mockito.junit.*; import java.util.*; +import static org.mockito.Mockito.*; + +@RunWith(MockitoJUnitRunner.class) public class BaseUnitTest { protected HabitList habitList; @@ -34,6 +42,10 @@ public class BaseUnitTest protected MemoryModelFactory modelFactory; + protected SingleThreadTaskRunner taskRunner; + + protected CommandRunner commandRunner; + @Before public void setUp() { @@ -42,8 +54,10 @@ public class BaseUnitTest DateUtils.setFixedLocalTime(fixed_local_time); modelFactory = new MemoryModelFactory(); - habitList = modelFactory.buildHabitList(); + habitList = spy(modelFactory.buildHabitList()); fixtures = new HabitFixtures(modelFactory); + taskRunner = new SingleThreadTaskRunner(); + commandRunner = new CommandRunner(taskRunner); } @After @@ -58,4 +72,10 @@ public class BaseUnitTest cal.set(year, month, day); return cal.getTimeInMillis(); } + + @Test + public void nothing() + { + + } } diff --git a/app/src/test/java/org/isoron/uhabits/commands/ArchiveHabitsCommandTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/commands/ArchiveHabitsCommandTest.java similarity index 92% rename from app/src/test/java/org/isoron/uhabits/commands/ArchiveHabitsCommandTest.java rename to uhabits-core/src/test/java/org/isoron/uhabits/core/commands/ArchiveHabitsCommandTest.java index 516c01ddf..fc2df1508 100644 --- a/app/src/test/java/org/isoron/uhabits/commands/ArchiveHabitsCommandTest.java +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/commands/ArchiveHabitsCommandTest.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. * @@ -17,10 +17,10 @@ * with this program. If not, see . */ -package org.isoron.uhabits.commands; +package org.isoron.uhabits.core.commands; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.junit.*; import java.util.*; diff --git a/app/src/test/java/org/isoron/uhabits/commands/ChangeHabitColorCommandTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/commands/ChangeHabitColorCommandTest.java similarity index 94% rename from app/src/test/java/org/isoron/uhabits/commands/ChangeHabitColorCommandTest.java rename to uhabits-core/src/test/java/org/isoron/uhabits/core/commands/ChangeHabitColorCommandTest.java index 78c39306d..790aa259e 100644 --- a/app/src/test/java/org/isoron/uhabits/commands/ChangeHabitColorCommandTest.java +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/commands/ChangeHabitColorCommandTest.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. * @@ -17,10 +17,10 @@ * with this program. If not, see . */ -package org.isoron.uhabits.commands; +package org.isoron.uhabits.core.commands; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.junit.*; import java.util.*; diff --git a/app/src/test/java/org/isoron/uhabits/commands/CommandParserTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/commands/CommandParserTest.java similarity index 66% rename from app/src/test/java/org/isoron/uhabits/commands/CommandParserTest.java rename to uhabits-core/src/test/java/org/isoron/uhabits/core/commands/CommandParserTest.java index c043bc8b6..07ad02c02 100644 --- a/app/src/test/java/org/isoron/uhabits/commands/CommandParserTest.java +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/commands/CommandParserTest.java @@ -17,20 +17,19 @@ * with this program. If not, see . */ -package org.isoron.uhabits.commands; +package org.isoron.uhabits.core.commands; import android.support.annotation.*; +import org.hamcrest.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.json.*; import org.junit.*; import java.util.*; -import static org.hamcrest.MatcherAssert.*; -import static org.hamcrest.Matchers.*; - +import static org.hamcrest.CoreMatchers.*; public class CommandParserTest extends BaseUnitTest { @@ -59,8 +58,8 @@ public class CommandParserTest extends BaseUnitTest original = new ArchiveHabitsCommand(habitList, selected); decoded = (ArchiveHabitsCommand) parser.parse(original.toJson()); - assertThat(decoded.getId(), equalTo(original.getId())); - assertThat(decoded.selected, equalTo(original.selected)); + MatcherAssert.assertThat(decoded.getId(), equalTo(original.getId())); + MatcherAssert.assertThat(decoded.selected, equalTo(original.selected)); } @Test @@ -70,9 +69,9 @@ public class CommandParserTest extends BaseUnitTest original = new ChangeHabitColorCommand(habitList, selected, 20); decoded = (ChangeHabitColorCommand) parser.parse(original.toJson()); - assertThat(decoded.getId(), equalTo(original.getId())); - assertThat(decoded.newColor, equalTo(original.newColor)); - assertThat(decoded.selected, equalTo(original.selected)); + MatcherAssert.assertThat(decoded.getId(), equalTo(original.getId())); + MatcherAssert.assertThat(decoded.newColor, equalTo(original.newColor)); + MatcherAssert.assertThat(decoded.selected, equalTo(original.selected)); } @Test @@ -87,9 +86,10 @@ public class CommandParserTest extends BaseUnitTest decoded = (CreateHabitCommand) parser.parse(original.toJson()); - assertThat(decoded.getId(), equalTo(original.getId())); - assertThat(decoded.savedId, equalTo(original.savedId)); - assertThat(decoded.model.getData(), equalTo(model.getData())); + MatcherAssert.assertThat(decoded.getId(), equalTo(original.getId())); + MatcherAssert.assertThat(decoded.savedId, equalTo(original.savedId)); + MatcherAssert.assertThat(decoded.model.getData(), equalTo(model + .getData())); } @Test @@ -99,10 +99,11 @@ public class CommandParserTest extends BaseUnitTest original = new CreateRepetitionCommand(habit, 1000, 5); decoded = (CreateRepetitionCommand) parser.parse(original.toJson()); - assertThat(decoded.getId(), equalTo(original.getId())); - assertThat(decoded.timestamp, equalTo(original.timestamp)); - assertThat(decoded.value, equalTo(original.value)); - assertThat(decoded.habit, equalTo(original.habit)); + MatcherAssert.assertThat(decoded.getId(), equalTo(original.getId())); + MatcherAssert.assertThat(decoded.timestamp, equalTo(original + .timestamp)); + MatcherAssert.assertThat(decoded.value, equalTo(original.value)); + MatcherAssert.assertThat(decoded.habit, equalTo(original.habit)); } @Test @@ -112,8 +113,8 @@ public class CommandParserTest extends BaseUnitTest original = new DeleteHabitsCommand(habitList, selected); decoded = (DeleteHabitsCommand) parser.parse(original.toJson()); - assertThat(decoded.getId(), equalTo(original.getId())); - assertThat(decoded.selected, equalTo(original.selected)); + MatcherAssert.assertThat(decoded.getId(), equalTo(original.getId())); + MatcherAssert.assertThat(decoded.selected, equalTo(original.selected)); } @Test @@ -129,9 +130,10 @@ public class CommandParserTest extends BaseUnitTest decoded = (EditHabitCommand) parser.parse(original.toJson()); - assertThat(decoded.getId(), equalTo(original.getId())); - assertThat(decoded.savedId, equalTo(original.savedId)); - assertThat(decoded.modified.getData(), equalTo(modified.getData())); + MatcherAssert.assertThat(decoded.getId(), equalTo(original.getId())); + MatcherAssert.assertThat(decoded.savedId, equalTo(original.savedId)); + MatcherAssert.assertThat(decoded.modified.getData(), equalTo(modified + .getData())); } @Test @@ -141,9 +143,10 @@ public class CommandParserTest extends BaseUnitTest original = new ToggleRepetitionCommand(habit, 1000); decoded = (ToggleRepetitionCommand) parser.parse(original.toJson()); - assertThat(decoded.getId(), equalTo(original.getId())); - assertThat(decoded.timestamp, equalTo(original.timestamp)); - assertThat(decoded.habit, equalTo(original.habit)); + MatcherAssert.assertThat(decoded.getId(), equalTo(original.getId())); + MatcherAssert.assertThat(decoded.timestamp, equalTo(original + .timestamp)); + MatcherAssert.assertThat(decoded.habit, equalTo(original.habit)); } @Test @@ -153,7 +156,7 @@ public class CommandParserTest extends BaseUnitTest original = new UnarchiveHabitsCommand(habitList, selected); decoded = (UnarchiveHabitsCommand) parser.parse(original.toJson()); - assertThat(decoded.getId(), equalTo(original.getId())); - assertThat(decoded.selected, equalTo(original.selected)); + MatcherAssert.assertThat(decoded.getId(), equalTo(original.getId())); + MatcherAssert.assertThat(decoded.selected, equalTo(original.selected)); } } \ No newline at end of file diff --git a/app/src/test/java/org/isoron/uhabits/commands/CreateHabitCommandTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/commands/CreateHabitCommandTest.java similarity index 94% rename from app/src/test/java/org/isoron/uhabits/commands/CreateHabitCommandTest.java rename to uhabits-core/src/test/java/org/isoron/uhabits/core/commands/CreateHabitCommandTest.java index 566a91b6f..9237b04b5 100644 --- a/app/src/test/java/org/isoron/uhabits/commands/CreateHabitCommandTest.java +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/commands/CreateHabitCommandTest.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. * @@ -17,10 +17,10 @@ * with this program. If not, see . */ -package org.isoron.uhabits.commands; +package org.isoron.uhabits.core.commands; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.junit.*; import static junit.framework.Assert.*; diff --git a/app/src/test/java/org/isoron/uhabits/commands/CreateRepetitionCommandTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/commands/CreateRepetitionCommandTest.java similarity index 89% rename from app/src/test/java/org/isoron/uhabits/commands/CreateRepetitionCommandTest.java rename to uhabits-core/src/test/java/org/isoron/uhabits/core/commands/CreateRepetitionCommandTest.java index 23ceb1192..f82d0ad0c 100644 --- a/app/src/test/java/org/isoron/uhabits/commands/CreateRepetitionCommandTest.java +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/commands/CreateRepetitionCommandTest.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. * @@ -17,17 +17,17 @@ * with this program. If not, see . */ -package org.isoron.uhabits.commands; +package org.isoron.uhabits.core.commands; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.utils.*; import org.junit.*; import static junit.framework.Assert.*; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; -import static org.isoron.uhabits.models.Checkmark.CHECKED_EXPLICITLY; +import static org.isoron.uhabits.core.models.Checkmark.CHECKED_EXPLICITLY; public class CreateRepetitionCommandTest extends BaseUnitTest { diff --git a/app/src/test/java/org/isoron/uhabits/commands/DeleteHabitsCommandTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/commands/DeleteHabitsCommandTest.java similarity index 94% rename from app/src/test/java/org/isoron/uhabits/commands/DeleteHabitsCommandTest.java rename to uhabits-core/src/test/java/org/isoron/uhabits/core/commands/DeleteHabitsCommandTest.java index b3fc7aa53..77d3e0523 100644 --- a/app/src/test/java/org/isoron/uhabits/commands/DeleteHabitsCommandTest.java +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/commands/DeleteHabitsCommandTest.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. * @@ -17,10 +17,10 @@ * with this program. If not, see . */ -package org.isoron.uhabits.commands; +package org.isoron.uhabits.core.commands; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.junit.*; import org.junit.rules.*; diff --git a/app/src/test/java/org/isoron/uhabits/commands/EditHabitCommandTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/commands/EditHabitCommandTest.java similarity index 96% rename from app/src/test/java/org/isoron/uhabits/commands/EditHabitCommandTest.java rename to uhabits-core/src/test/java/org/isoron/uhabits/core/commands/EditHabitCommandTest.java index 6766497a4..003cdf6bd 100644 --- a/app/src/test/java/org/isoron/uhabits/commands/EditHabitCommandTest.java +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/commands/EditHabitCommandTest.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. * @@ -17,10 +17,10 @@ * with this program. If not, see . */ -package org.isoron.uhabits.commands; +package org.isoron.uhabits.core.commands; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.junit.*; import static org.hamcrest.MatcherAssert.*; diff --git a/app/src/test/java/org/isoron/uhabits/commands/ToggleRepetitionCommandTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/commands/ToggleRepetitionCommandTest.java similarity index 91% rename from app/src/test/java/org/isoron/uhabits/commands/ToggleRepetitionCommandTest.java rename to uhabits-core/src/test/java/org/isoron/uhabits/core/commands/ToggleRepetitionCommandTest.java index 4f0eb461a..554d631d7 100644 --- a/app/src/test/java/org/isoron/uhabits/commands/ToggleRepetitionCommandTest.java +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/commands/ToggleRepetitionCommandTest.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. * @@ -17,11 +17,11 @@ * with this program. If not, see . */ -package org.isoron.uhabits.commands; +package org.isoron.uhabits.core.commands; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.utils.*; import org.junit.*; import static junit.framework.Assert.*; diff --git a/app/src/test/java/org/isoron/uhabits/commands/UnarchiveHabitsCommandTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/commands/UnarchiveHabitsCommandTest.java similarity index 93% rename from app/src/test/java/org/isoron/uhabits/commands/UnarchiveHabitsCommandTest.java rename to uhabits-core/src/test/java/org/isoron/uhabits/core/commands/UnarchiveHabitsCommandTest.java index 09b9004e3..81c1d2465 100644 --- a/app/src/test/java/org/isoron/uhabits/commands/UnarchiveHabitsCommandTest.java +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/commands/UnarchiveHabitsCommandTest.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. * @@ -17,10 +17,10 @@ * with this program. If not, see . */ -package org.isoron.uhabits.commands; +package org.isoron.uhabits.core.commands; import org.isoron.uhabits.*; -import org.isoron.uhabits.models.*; +import org.isoron.uhabits.core.models.*; import org.junit.*; import java.util.*; diff --git a/app/src/test/java/org/isoron/uhabits/models/CheckmarkListTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/models/CheckmarkListTest.java similarity index 96% rename from app/src/test/java/org/isoron/uhabits/models/CheckmarkListTest.java rename to uhabits-core/src/test/java/org/isoron/uhabits/core/models/CheckmarkListTest.java index e441910a8..b510d8fad 100644 --- a/app/src/test/java/org/isoron/uhabits/models/CheckmarkListTest.java +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/models/CheckmarkListTest.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. * @@ -17,17 +17,17 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models; +package org.isoron.uhabits.core.models; import org.isoron.uhabits.*; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.utils.*; import org.junit.*; import java.io.*; import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.core.IsEqual.*; -import static org.isoron.uhabits.models.Checkmark.*; +import static org.isoron.uhabits.core.models.Checkmark.*; public class CheckmarkListTest extends BaseUnitTest { diff --git a/app/src/test/java/org/isoron/uhabits/models/HabitListTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/models/HabitListTest.java similarity index 95% rename from app/src/test/java/org/isoron/uhabits/models/HabitListTest.java rename to uhabits-core/src/test/java/org/isoron/uhabits/core/models/HabitListTest.java index 961e1536c..ee1c70e92 100644 --- a/app/src/test/java/org/isoron/uhabits/models/HabitListTest.java +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/models/HabitListTest.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. * @@ -17,7 +17,7 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models; +package org.isoron.uhabits.core.models; import org.hamcrest.*; import org.isoron.uhabits.*; @@ -26,11 +26,9 @@ import org.junit.*; import java.io.*; import java.util.*; -import static junit.framework.Assert.*; import static org.hamcrest.CoreMatchers.*; -import static org.hamcrest.MatcherAssert.*; -import static org.hamcrest.core.IsEqual.equalTo; -import static org.isoron.uhabits.models.HabitList.Order.*; +import static org.isoron.uhabits.core.models.HabitList.Order.*; +import static org.junit.Assert.*; @SuppressWarnings("JavaDoc") public class HabitListTest extends BaseUnitTest @@ -70,12 +68,6 @@ public class HabitListTest extends BaseUnitTest .build()); } - @Test - public void test_size() - { - assertThat(habitList.size(), equalTo(10)); - } - @Test public void test_countActive() { @@ -114,6 +106,54 @@ public class HabitListTest extends BaseUnitTest assertThat(habit1, equalTo(habit2)); } + @Test + public void test_ordering() + { + HabitList list = modelFactory.buildHabitList(); + Habit h1 = fixtures.createEmptyHabit(); + h1.setName("A Habit"); + h1.setColor(2); + + Habit h2 = fixtures.createEmptyHabit(); + h2.setName("B Habit"); + h2.setColor(2); + + Habit h3 = fixtures.createEmptyHabit(); + h3.setName("C Habit"); + h3.setColor(0); + + Habit h4 = fixtures.createEmptyHabit(); + h4.setName("D Habit"); + h4.setColor(1); + + list.add(h3); + list.add(h1); + list.add(h4); + list.add(h2); + + list.setOrder(BY_POSITION); + assertThat(list.getByPosition(0), equalTo(h3)); + assertThat(list.getByPosition(1), equalTo(h1)); + assertThat(list.getByPosition(2), equalTo(h4)); + assertThat(list.getByPosition(3), equalTo(h2)); + + list.setOrder(BY_NAME); + assertThat(list.getByPosition(0), equalTo(h1)); + assertThat(list.getByPosition(1), equalTo(h2)); + assertThat(list.getByPosition(2), equalTo(h3)); + assertThat(list.getByPosition(3), equalTo(h4)); + + list.remove(h1); + list.add(h1); + assertThat(list.getByPosition(0), equalTo(h1)); + + list.setOrder(BY_COLOR); + assertThat(list.getByPosition(0), equalTo(h3)); + assertThat(list.getByPosition(1), equalTo(h4)); + assertThat(list.getByPosition(2), equalTo(h1)); + assertThat(list.getByPosition(3), equalTo(h2)); + } + @Test public void test_reorder() { @@ -150,6 +190,12 @@ public class HabitListTest extends BaseUnitTest } } + @Test + public void test_size() + { + assertThat(habitList.size(), equalTo(10)); + } + @Test public void test_writeCSV() throws IOException { @@ -180,52 +226,4 @@ public class HabitListTest extends BaseUnitTest MatcherAssert.assertThat(writer.toString(), equalTo(expectedCSV)); } - - @Test - public void test_ordering() - { - HabitList list = modelFactory.buildHabitList(); - Habit h1 = fixtures.createEmptyHabit(); - h1.setName("A Habit"); - h1.setColor(2); - - Habit h2 = fixtures.createEmptyHabit(); - h2.setName("B Habit"); - h2.setColor(2); - - Habit h3 = fixtures.createEmptyHabit(); - h3.setName("C Habit"); - h3.setColor(0); - - Habit h4 = fixtures.createEmptyHabit(); - h4.setName("D Habit"); - h4.setColor(1); - - list.add(h3); - list.add(h1); - list.add(h4); - list.add(h2); - - list.setOrder(BY_POSITION); - assertThat(list.getByPosition(0), equalTo(h3)); - assertThat(list.getByPosition(1), equalTo(h1)); - assertThat(list.getByPosition(2), equalTo(h4)); - assertThat(list.getByPosition(3), equalTo(h2)); - - list.setOrder(BY_NAME); - assertThat(list.getByPosition(0), equalTo(h1)); - assertThat(list.getByPosition(1), equalTo(h2)); - assertThat(list.getByPosition(2), equalTo(h3)); - assertThat(list.getByPosition(3), equalTo(h4)); - - list.remove(h1); - list.add(h1); - assertThat(list.getByPosition(0), equalTo(h1)); - - list.setOrder(BY_COLOR); - assertThat(list.getByPosition(0), equalTo(h3)); - assertThat(list.getByPosition(1), equalTo(h4)); - assertThat(list.getByPosition(2), equalTo(h1)); - assertThat(list.getByPosition(3), equalTo(h2)); - } } \ No newline at end of file diff --git a/app/src/test/java/org/isoron/uhabits/models/HabitTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/models/HabitTest.java similarity index 52% rename from app/src/test/java/org/isoron/uhabits/models/HabitTest.java rename to uhabits-core/src/test/java/org/isoron/uhabits/core/models/HabitTest.java index 327d04267..6b5343827 100644 --- a/app/src/test/java/org/isoron/uhabits/models/HabitTest.java +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/models/HabitTest.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. * @@ -17,17 +17,21 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models; +package org.isoron.uhabits.core.models; import org.isoron.uhabits.*; import org.junit.*; +import org.junit.rules.*; import static org.hamcrest.CoreMatchers.*; -import static org.hamcrest.core.IsNot.not; +import static org.isoron.uhabits.core.utils.DateUtils.*; import static org.junit.Assert.*; public class HabitTest extends BaseUnitTest { + @Rule + public final ExpectedException exception = ExpectedException.none(); + @Override public void setUp() { @@ -41,10 +45,10 @@ public class HabitTest extends BaseUnitTest assertFalse(habit.isArchived()); assertThat(habit.hasReminder(), is(false)); - assertThat(habit.getStreaks(), is(not(nullValue()))); - assertThat(habit.getScores(), is(not(nullValue()))); - assertThat(habit.getRepetitions(), is(not(nullValue()))); - assertThat(habit.getCheckmarks(), is(not(nullValue()))); + assertNotNull(habit.getStreaks()); + assertNotNull(habit.getScores()); + assertNotNull(habit.getRepetitions()); + assertNotNull(habit.getCheckmarks()); } @Test @@ -77,4 +81,49 @@ public class HabitTest extends BaseUnitTest h.clearReminder(); assertThat(h.hasReminder(), is(false)); } + + @Test + public void test_isCompleted() throws Exception + { + Habit h = modelFactory.buildHabit(); + assertFalse(h.isCompletedToday()); + h.getRepetitions().toggle(getStartOfToday()); + assertTrue(h.isCompletedToday()); + } + + @Test + public void test_isCompleted_numerical() throws Exception + { + Habit h = modelFactory.buildHabit(); + h.setType(Habit.NUMBER_HABIT); + h.setTargetType(Habit.AT_LEAST); + h.setTargetValue(100.0); + assertFalse(h.isCompletedToday()); + + h.getRepetitions().toggle(getStartOfToday(), 200); + assertTrue(h.isCompletedToday()); + h.getRepetitions().toggle(getStartOfToday(), 100); + assertTrue(h.isCompletedToday()); + h.getRepetitions().toggle(getStartOfToday(), 50); + assertFalse(h.isCompletedToday()); + + h.setTargetType(Habit.AT_MOST); + h.getRepetitions().toggle(getStartOfToday(), 200); + assertFalse(h.isCompletedToday()); + h.getRepetitions().toggle(getStartOfToday(), 100); + assertTrue(h.isCompletedToday()); + h.getRepetitions().toggle(getStartOfToday(), 50); + assertTrue(h.isCompletedToday()); + } + + @Test + public void testURI() throws Exception + { + assertTrue(habitList.isEmpty()); + Habit h = modelFactory.buildHabit(); + habitList.add(h); + assertThat(h.getId(), equalTo(0L)); + assertThat(h.getUriString(), + equalTo("content://org.isoron.uhabits/habit/0")); + } } \ No newline at end of file diff --git a/app/src/test/java/org/isoron/uhabits/models/RepetitionListTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/models/RepetitionListTest.java similarity index 74% rename from app/src/test/java/org/isoron/uhabits/models/RepetitionListTest.java rename to uhabits-core/src/test/java/org/isoron/uhabits/core/models/RepetitionListTest.java index 585387604..68a089730 100644 --- a/app/src/test/java/org/isoron/uhabits/models/RepetitionListTest.java +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/models/RepetitionListTest.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. * @@ -17,19 +17,22 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models; +package org.isoron.uhabits.core.models; import android.support.annotation.*; import org.isoron.uhabits.*; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.utils.*; import org.junit.*; import java.util.*; -import static org.hamcrest.MatcherAssert.*; +import static junit.framework.TestCase.assertFalse; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.*; import static org.hamcrest.core.IsEqual.*; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.*; public class RepetitionListTest extends BaseUnitTest @@ -58,14 +61,15 @@ public class RepetitionListTest extends BaseUnitTest today = DateUtils.getStartOfToday(); day = DateUtils.millisecondsInOneDay; - reps.toggleTimestamp(today - 3 * day); - reps.toggleTimestamp(today - 2 * day); - reps.toggleTimestamp(today); - reps.toggleTimestamp(today - 7 * day); - reps.toggleTimestamp(today - 5 * day); + reps.toggle(today - 3 * day); + reps.toggle(today - 2 * day); + reps.toggle(today); + reps.toggle(today - 7 * day); + reps.toggle(today - 5 * day); listener = mock(ModelObservable.Listener.class); reps.getObservable().addListener(listener); + reset(listener); } @Override @@ -130,7 +134,7 @@ public class RepetitionListTest extends BaseUnitTest weekdayCount[month][week]++; monthCount[month]++; } - reps.toggleTimestamp(day.getTimeInMillis()); + reps.toggle(day.getTimeInMillis()); } } @@ -155,17 +159,33 @@ public class RepetitionListTest extends BaseUnitTest } @Test - public void test_toggleTimestamp() + public void test_toggle() { - assertThat(reps.containsTimestamp(today), equalTo(true)); - reps.toggleTimestamp(today); - assertThat(reps.containsTimestamp(today), equalTo(false)); + assertTrue(reps.containsTimestamp(today)); + reps.toggle(today); + assertFalse(reps.containsTimestamp(today)); + verify(listener).onModelChange(); + reset(listener); + + assertFalse(reps.containsTimestamp(today - day)); + reps.toggle(today - day); + assertTrue(reps.containsTimestamp(today - day)); verify(listener).onModelChange(); reset(listener); - assertThat(reps.containsTimestamp(today - day), equalTo(false)); - reps.toggleTimestamp(today - day); - assertThat(reps.containsTimestamp(today - day), equalTo(true)); + habit.setType(Habit.NUMBER_HABIT); + reps.toggle(today, 100); + Repetition check = reps.getByTimestamp(today); + assertNotNull(check); + assertThat(check.getValue(), equalTo(100)); verify(listener).onModelChange(); + reset(listener); + + reps.toggle(today, 500); + check = reps.getByTimestamp(today); + assertNotNull(check); + assertThat(check.getValue(), equalTo(500)); + verify(listener, times(2)).onModelChange(); + reset(listener); } } \ No newline at end of file diff --git a/app/src/test/java/org/isoron/uhabits/models/ScoreListTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/models/ScoreListTest.java similarity index 95% rename from app/src/test/java/org/isoron/uhabits/models/ScoreListTest.java rename to uhabits-core/src/test/java/org/isoron/uhabits/core/models/ScoreListTest.java index f0295ad08..44d5214d3 100644 --- a/app/src/test/java/org/isoron/uhabits/models/ScoreListTest.java +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/models/ScoreListTest.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. * @@ -17,10 +17,10 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models; +package org.isoron.uhabits.core.models; import org.isoron.uhabits.*; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.utils.*; import org.junit.*; import java.io.*; @@ -28,7 +28,7 @@ import java.util.*; import static org.hamcrest.CoreMatchers.*; import static org.hamcrest.MatcherAssert.*; -import static org.hamcrest.number.IsCloseTo.closeTo; +import static org.hamcrest.number.IsCloseTo.*; public class ScoreListTest extends BaseUnitTest { @@ -205,6 +205,6 @@ public class ScoreListTest extends BaseUnitTest long day = DateUtils.millisecondsInOneDay; for (int i = from; i < to; i++) - reps.toggleTimestamp(today - i * day); + reps.toggle(today - i * day); } } diff --git a/app/src/test/java/org/isoron/uhabits/models/ScoreTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/models/ScoreTest.java similarity index 93% rename from app/src/test/java/org/isoron/uhabits/models/ScoreTest.java rename to uhabits-core/src/test/java/org/isoron/uhabits/core/models/ScoreTest.java index 0a94ad036..6a90a406c 100644 --- a/app/src/test/java/org/isoron/uhabits/models/ScoreTest.java +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/models/ScoreTest.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. * @@ -17,13 +17,13 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models; +package org.isoron.uhabits.core.models; import org.isoron.uhabits.*; import org.junit.*; import static org.hamcrest.number.IsCloseTo.*; -import static org.isoron.uhabits.models.Score.*; +import static org.isoron.uhabits.core.models.Score.*; import static org.junit.Assert.*; public class ScoreTest extends BaseUnitTest diff --git a/app/src/test/java/org/isoron/uhabits/models/StreakListTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/models/StreakListTest.java similarity index 96% rename from app/src/test/java/org/isoron/uhabits/models/StreakListTest.java rename to uhabits-core/src/test/java/org/isoron/uhabits/core/models/StreakListTest.java index 5d34c6fd5..0f9571e2f 100644 --- a/app/src/test/java/org/isoron/uhabits/models/StreakListTest.java +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/models/StreakListTest.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. * @@ -17,10 +17,10 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models; +package org.isoron.uhabits.core.models; import org.isoron.uhabits.*; -import org.isoron.uhabits.utils.*; +import org.isoron.uhabits.core.utils.*; import org.junit.*; import java.util.*; diff --git a/app/src/test/java/org/isoron/uhabits/models/WeekdayListTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/models/WeekdayListTest.java similarity index 94% rename from app/src/test/java/org/isoron/uhabits/models/WeekdayListTest.java rename to uhabits-core/src/test/java/org/isoron/uhabits/core/models/WeekdayListTest.java index 406b6e39b..efe83798c 100644 --- a/app/src/test/java/org/isoron/uhabits/models/WeekdayListTest.java +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/models/WeekdayListTest.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. * @@ -17,7 +17,7 @@ * with this program. If not, see . */ -package org.isoron.uhabits.models; +package org.isoron.uhabits.core.models; import org.isoron.uhabits.*; import org.junit.*; diff --git a/app/src/test/java/org/isoron/uhabits/tasks/SingleThreadTaskRunnerTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/tasks/SingleThreadTaskRunnerTest.java similarity index 93% rename from app/src/test/java/org/isoron/uhabits/tasks/SingleThreadTaskRunnerTest.java rename to uhabits-core/src/test/java/org/isoron/uhabits/core/tasks/SingleThreadTaskRunnerTest.java index 57b694a7b..3f7e3090e 100644 --- a/app/src/test/java/org/isoron/uhabits/tasks/SingleThreadTaskRunnerTest.java +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/tasks/SingleThreadTaskRunnerTest.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. * @@ -17,7 +17,7 @@ * with this program. If not, see . */ -package org.isoron.uhabits.tasks; +package org.isoron.uhabits.core.tasks; import org.isoron.uhabits.*; import org.junit.*; diff --git a/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/screens/about/AboutBehaviorTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/screens/about/AboutBehaviorTest.java new file mode 100644 index 000000000..f39984abb --- /dev/null +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/screens/about/AboutBehaviorTest.java @@ -0,0 +1,94 @@ +/* + * 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.core.ui.screens.about; + +import org.isoron.uhabits.*; +import org.isoron.uhabits.core.preferences.*; +import org.junit.*; +import org.mockito.*; + +import static org.isoron.uhabits.core.ui.screens.about.AboutBehavior.Message.YOU_ARE_NOW_A_DEVELOPER; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyZeroInteractions; + +public class AboutBehaviorTest extends BaseUnitTest +{ + private AboutBehavior behavior; + + @Mock + private Preferences prefs; + + @Mock + private AboutBehavior.Screen screen; + + @Before + public void setUp() + { + behavior = new AboutBehavior(prefs, screen); + } + + @Test + public void onPressDeveloperCountdown() throws Exception + { + behavior.onPressDeveloperCountdown(); + behavior.onPressDeveloperCountdown(); + behavior.onPressDeveloperCountdown(); + behavior.onPressDeveloperCountdown(); + verifyZeroInteractions(screen); + verifyZeroInteractions(prefs); + + behavior.onPressDeveloperCountdown(); + verify(screen).showMessage(YOU_ARE_NOW_A_DEVELOPER); + verify(prefs).setDeveloper(true); + + behavior.onPressDeveloperCountdown(); + verifyZeroInteractions(screen); + verifyZeroInteractions(prefs); + } + + @Test + public void onRateApp() throws Exception + { + behavior.onRateApp(); + verify(screen).showRateAppWebsite(); + } + + @Test + public void onSendFeedback() throws Exception + { + behavior.onSendFeedback(); + verify(screen).showSendFeedbackScreen(); + } + + @Test + public void onTranslateApp() throws Exception + { + behavior.onTranslateApp(); + verify(screen).showTranslationWebsite(); + } + + @Test + public void onViewSourceCode() throws Exception + { + behavior.onViewSourceCode(); + verify(screen).showSourceCodeWebsite(); + } + +} \ No newline at end of file diff --git a/app/src/test/java/org/isoron/uhabits/activities/habits/list/model/HabitCardListCacheTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/HabitCardListCacheTest.java similarity index 90% rename from app/src/test/java/org/isoron/uhabits/activities/habits/list/model/HabitCardListCacheTest.java rename to uhabits-core/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/HabitCardListCacheTest.java index b9965ad6c..abad82464 100644 --- a/app/src/test/java/org/isoron/uhabits/activities/habits/list/model/HabitCardListCacheTest.java +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/HabitCardListCacheTest.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. * @@ -17,18 +17,18 @@ * with this program. If not, see . */ -package org.isoron.uhabits.activities.habits.list.model; +package org.isoron.uhabits.core.ui.screens.habits.list; + +import junit.framework.Assert; import org.isoron.uhabits.*; -import org.isoron.uhabits.commands.*; -import org.isoron.uhabits.models.*; -import org.isoron.uhabits.tasks.*; -import org.isoron.uhabits.utils.*; -import org.junit.*; +import org.isoron.uhabits.core.commands.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.utils.*; +import org.junit.Test; import java.util.*; -import static junit.framework.Assert.*; import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.core.IsEqual.*; import static org.mockito.Mockito.*; @@ -39,12 +39,11 @@ public class HabitCardListCacheTest extends BaseUnitTest private HabitCardListCache.Listener listener; - private CommandRunner commandRunner; - @Override public void setUp() { super.setUp(); + habitList.removeAll(); for (int i = 0; i < 10; i++) { @@ -52,9 +51,6 @@ public class HabitCardListCacheTest extends BaseUnitTest else habitList.add(fixtures.createShortHabit()); } - SingleThreadTaskRunner taskRunner = new SingleThreadTaskRunner(); - commandRunner = new CommandRunner(taskRunner); - cache = new HabitCardListCache(habitList, commandRunner, taskRunner); cache.setCheckmarkCount(10); cache.refreshAllHabits(); @@ -68,7 +64,6 @@ public class HabitCardListCacheTest extends BaseUnitTest public void tearDown() { cache.onDetached(); - super.tearDown(); } @Test @@ -105,7 +100,7 @@ public class HabitCardListCacheTest extends BaseUnitTest assertThat(cache.getHabitCount(), equalTo(10)); Habit h = habitList.getByPosition(3); - assertNotNull(h.getId()); + junit.framework.Assert.assertNotNull(h.getId()); double score = h.getScores().getTodayValue(); assertThat(cache.getHabitByPosition(3), equalTo(h)); @@ -188,7 +183,7 @@ public class HabitCardListCacheTest extends BaseUnitTest protected void removeHabitAt(int position) { Habit h = habitList.getByPosition(position); - assertNotNull(h); + Assert.assertNotNull(h); habitList.remove(h); } diff --git a/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/HintListTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/HintListTest.java new file mode 100644 index 000000000..f7509b1a0 --- /dev/null +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/HintListTest.java @@ -0,0 +1,79 @@ +/* + * 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.core.ui.screens.habits.list; + +import org.isoron.uhabits.*; +import org.isoron.uhabits.core.preferences.*; +import org.isoron.uhabits.core.utils.*; +import org.junit.*; +import org.mockito.*; + +import static junit.framework.TestCase.assertFalse; +import static org.hamcrest.MatcherAssert.*; +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.*; + +public class HintListTest extends BaseUnitTest +{ + private HintList hintList; + + private String[] hints; + + @Mock + private Preferences prefs; + + private long today; + + private long yesterday; + + @Override + public void setUp() + { + super.setUp(); + today = DateUtils.getStartOfToday(); + yesterday = today - DateUtils.millisecondsInOneDay; + + hints = new String[]{ "hint1", "hint2", "hint3" }; + hintList = new HintList(prefs, hints); + } + + @Test + public void pop() throws Exception + { + when(prefs.getLastHintNumber()).thenReturn(-1); + assertThat(hintList.pop(), equalTo("hint1")); + verify(prefs).updateLastHint(0, today); + + when(prefs.getLastHintNumber()).thenReturn(2); + assertNull(hintList.pop()); + } + + @Test + public void shouldShow() throws Exception + { + when(prefs.getLastHintTimestamp()).thenReturn(today); + assertFalse(hintList.shouldShow()); + + when(prefs.getLastHintTimestamp()).thenReturn(yesterday); + assertTrue(hintList.shouldShow()); + } +} \ No newline at end of file diff --git a/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehaviorTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehaviorTest.java new file mode 100644 index 000000000..6fbef66cf --- /dev/null +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsBehaviorTest.java @@ -0,0 +1,169 @@ +/* + * 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.core.ui.screens.habits.list; + +import org.isoron.uhabits.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.preferences.*; +import org.isoron.uhabits.core.utils.*; +import org.junit.*; +import org.mockito.*; + +import java.io.*; + +import static java.nio.file.Files.*; +import static junit.framework.TestCase.assertTrue; +import static org.apache.commons.io.FileUtils.*; +import static org.hamcrest.CoreMatchers.*; +import static org.isoron.uhabits.core.ui.screens.habits.list.ListHabitsBehavior.Message.*; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.*; +import static org.mockito.Mockito.any; +import static org.mockito.Mockito.*; + +public class ListHabitsBehaviorTest extends BaseUnitTest +{ + @Mock + private ListHabitsBehavior.System system; + + @Mock + private Preferences prefs; + + private ListHabitsBehavior behavior; + + @Mock + private ListHabitsBehavior.Screen screen; + + private Habit habit1, habit2; + + @Captor + ArgumentCaptor picker; + + @Override + @Before + public void setUp() + { + super.setUp(); + habit1 = fixtures.createShortHabit(); + habit2 = fixtures.createNumericalHabit(); + habitList.add(habit1); + habitList.add(habit2); + clearInvocations(habitList); + + behavior = new ListHabitsBehavior(habitList, system, taskRunner, screen, + commandRunner, prefs); + } + + @Test + public void testOnEdit() + { + behavior.onEdit(habit2, DateUtils.getStartOfToday()); + verify(screen).showNumberPicker(eq(0.1), eq("miles"), picker.capture()); + picker.getValue().onNumberPicked(100); + assertThat(habit2.getCheckmarks().getTodayValue(), equalTo(100000)); + } + + @Test + public void testOnExportCSV() throws Exception + { + File outputDir = createTempDirectory("CSV").toFile(); + when(system.getCSVOutputDir()).thenReturn(outputDir); + behavior.onExportCSV(); + verify(screen).showSendFileScreen(any()); + assertThat(listFiles(outputDir, null, false).size(), equalTo(1)); + deleteDirectory(outputDir); + } + + @Test + public void testOnExportCSV_fail() throws Exception + { + File outputDir = createTempDirectory("CSV").toFile(); + outputDir.setWritable(false); + when(system.getCSVOutputDir()).thenReturn(outputDir); + behavior.onExportCSV(); + verify(screen).showMessage(COULD_NOT_EXPORT); + } + + @Test + public void testOnHabitClick() + { + behavior.onClickHabit(habit1); + verify(screen).showHabitScreen(habit1); + } + + @Test + public void testOnHabitReorder() + { + Habit from = habit1; + Habit to = habit2; + behavior.onReorderHabit(from, to); + verify(habitList).reorder(from, to); + } + + @Test + public void testOnRepairDB() + { + behavior.onRepairDB(); + verify(habitList).repair(); + verify(screen).showMessage(DATABASE_REPAIRED); + } + + @Test + public void testOnStartup_firstLaunch() + { + long today = DateUtils.getStartOfToday(); + + when(prefs.isFirstRun()).thenReturn(true); + behavior.onStartup(); + verify(prefs).setFirstRun(false); + verify(prefs).updateLastHint(-1, today); + verify(screen).showIntroScreen(); + } + + @Test + public void testOnStartup_notFirstLaunch() + { + when(prefs.isFirstRun()).thenReturn(false); + behavior.onStartup(); + verify(prefs).incrementLaunchCount(); + } + + @Test + public void testOnToggle() + { + assertTrue(habit1.isCompletedToday()); + behavior.onToggle(habit1, DateUtils.getStartOfToday()); + assertFalse(habit1.isCompletedToday()); + } + + @Test + public void testOnSendBugReport() throws IOException + { + when(system.getBugReport()).thenReturn("hello"); + behavior.onSendBugReport(); + verify(screen).showSendBugReportToDeveloperScreen("hello"); + + when(system.getBugReport()).thenThrow(new IOException()); + behavior.onSendBugReport(); + verify(screen).showMessage(COULD_NOT_GENERATE_BUG_REPORT); + + } + +} \ No newline at end of file diff --git a/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehaviorTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehaviorTest.java new file mode 100644 index 000000000..af71677a3 --- /dev/null +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehaviorTest.java @@ -0,0 +1,190 @@ +/* + * 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.core.ui.screens.habits.list; + +import org.isoron.uhabits.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.preferences.*; +import org.isoron.uhabits.core.ui.*; +import org.junit.*; +import org.mockito.*; + +import static junit.framework.TestCase.*; +import static org.hamcrest.MatcherAssert.*; +import static org.hamcrest.Matchers.*; +import static org.isoron.uhabits.core.models.HabitList.Order.*; +import static org.mockito.Mockito.*; + +public class ListHabitsMenuBehaviorTest extends BaseUnitTest +{ + private ListHabitsMenuBehavior behavior; + + @Mock + private ListHabitsMenuBehavior.Screen screen; + + @Mock + private ListHabitsMenuBehavior.Adapter adapter; + + @Mock + private Preferences prefs; + + @Mock + private ThemeSwitcher themeSwitcher; + + @Captor + private ArgumentCaptor matcherCaptor; + + @Captor + private ArgumentCaptor orderCaptor; + + @Override + public void setUp() + { + super.setUp(); + behavior = + new ListHabitsMenuBehavior(screen, adapter, prefs, themeSwitcher); + clearInvocations(adapter); + } + + @Test + public void testInitialFilter() + { + when(prefs.getShowArchived()).thenReturn(true); + when(prefs.getShowCompleted()).thenReturn(true); + + behavior = + new ListHabitsMenuBehavior(screen, adapter, prefs, themeSwitcher); + verify(adapter).setFilter(matcherCaptor.capture()); + verify(adapter).refresh(); + verifyNoMoreInteractions(adapter); + clearInvocations(adapter); + + assertTrue(matcherCaptor.getValue().isArchivedAllowed()); + assertTrue(matcherCaptor.getValue().isCompletedAllowed()); + + when(prefs.getShowArchived()).thenReturn(false); + when(prefs.getShowCompleted()).thenReturn(false); + + behavior = + new ListHabitsMenuBehavior(screen, adapter, prefs, themeSwitcher); + verify(adapter).setFilter(matcherCaptor.capture()); + verify(adapter).refresh(); + verifyNoMoreInteractions(adapter); + + assertFalse(matcherCaptor.getValue().isArchivedAllowed()); + assertFalse(matcherCaptor.getValue().isCompletedAllowed()); + } + + @Test + public void testOnCreateHabit() + { + behavior.onCreateHabit(); + verify(screen).showCreateHabitScreen(); + } + + @Test + public void testOnSortByColor() + { + behavior.onSortByColor(); + verify(adapter).setOrder(orderCaptor.capture()); + assertThat(orderCaptor.getValue(), equalTo(BY_COLOR)); + } + + @Test + public void testOnSortManually() + { + behavior.onSortByManually(); + verify(adapter).setOrder(orderCaptor.capture()); + assertThat(orderCaptor.getValue(), equalTo(BY_POSITION)); + } + + @Test + public void testOnSortScore() + { + behavior.onSortByScore(); + verify(adapter).setOrder(orderCaptor.capture()); + assertThat(orderCaptor.getValue(), equalTo(BY_SCORE)); + } + + @Test + public void testOnSortName() + { + behavior.onSortByName(); + verify(adapter).setOrder(orderCaptor.capture()); + assertThat(orderCaptor.getValue(), equalTo(BY_NAME)); + } + + @Test + public void testOnToggleShowArchived() + { + behavior.onToggleShowArchived(); + verify(adapter).setFilter(matcherCaptor.capture()); + assertTrue(matcherCaptor.getValue().isArchivedAllowed()); + + clearInvocations(adapter); + + behavior.onToggleShowArchived(); + verify(adapter).setFilter(matcherCaptor.capture()); + assertFalse(matcherCaptor.getValue().isArchivedAllowed()); + } + + @Test + public void testOnToggleShowCompleted() + { + behavior.onToggleShowCompleted(); + verify(adapter).setFilter(matcherCaptor.capture()); + assertTrue(matcherCaptor.getValue().isCompletedAllowed()); + + clearInvocations(adapter); + + behavior.onToggleShowCompleted(); + verify(adapter).setFilter(matcherCaptor.capture()); + assertFalse(matcherCaptor.getValue().isCompletedAllowed()); + } + + @Test + public void testOnViewAbout() + { + behavior.onViewAbout(); + verify(screen).showAboutScreen(); + } + + @Test + public void testOnViewFAQ() + { + behavior.onViewFAQ(); + verify(screen).showFAQScreen(); + } + + @Test + public void testOnViewSettings() + { + behavior.onViewSettings(); + verify(screen).showSettingsScreen(); + } + + @Test + public void testOnToggleNightMode() + { + behavior.onToggleNightMode(); + verify(themeSwitcher).toggleNightMode(); + verify(screen).applyTheme(); + } +} \ No newline at end of file diff --git a/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehaviorTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehaviorTest.java new file mode 100644 index 000000000..3e2632b5b --- /dev/null +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsSelectionMenuBehaviorTest.java @@ -0,0 +1,159 @@ +/* + * 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.core.ui.screens.habits.list; + +import org.isoron.uhabits.*; +import org.isoron.uhabits.core.models.*; +import org.isoron.uhabits.core.ui.callbacks.*; +import org.junit.*; +import org.mockito.*; + +import java.util.*; + +import static java.util.Arrays.*; +import static java.util.Collections.*; +import static junit.framework.TestCase.*; +import static org.hamcrest.MatcherAssert.*; +import static org.hamcrest.Matchers.*; +import static org.mockito.Mockito.*; + +public class ListHabitsSelectionMenuBehaviorTest extends BaseUnitTest +{ + @Mock + private ListHabitsSelectionMenuBehavior.Screen screen; + + @Mock + private ListHabitsSelectionMenuBehavior.Adapter adapter; + + private ListHabitsSelectionMenuBehavior behavior; + + private Habit habit1, habit2, habit3; + + @Captor + private ArgumentCaptor colorPickerCallback; + + @Captor + private ArgumentCaptor deleteCallback; + + @Test + public void canArchive() throws Exception + { + when(adapter.getSelected()).thenReturn(asList(habit1, habit2)); + assertFalse(behavior.canArchive()); + + when(adapter.getSelected()).thenReturn(asList(habit2, habit3)); + assertTrue(behavior.canArchive()); + } + + @Test + public void canEdit() throws Exception + { + when(adapter.getSelected()).thenReturn(singletonList(habit1)); + assertTrue(behavior.canEdit()); + + when(adapter.getSelected()).thenReturn(asList(habit1, habit2)); + assertFalse(behavior.canEdit()); + } + + @Test + public void canUnarchive() throws Exception + { + when(adapter.getSelected()).thenReturn(asList(habit1, habit2)); + assertFalse(behavior.canUnarchive()); + + when(adapter.getSelected()).thenReturn(singletonList(habit1)); + assertTrue(behavior.canUnarchive()); + } + + @Test + public void onArchiveHabits() throws Exception + { + assertFalse(habit2.isArchived()); + when(adapter.getSelected()).thenReturn(singletonList(habit2)); + behavior.onArchiveHabits(); + assertTrue(habit2.isArchived()); + } + + @Test + public void onChangeColor() throws Exception + { + assertThat(habit1.getColor(), equalTo(5)); + assertThat(habit2.getColor(), equalTo(5)); + when(adapter.getSelected()).thenReturn(asList(habit1, habit2)); + + behavior.onChangeColor(); + + verify(screen).showColorPicker(eq(5), colorPickerCallback.capture()); + colorPickerCallback.getValue().onColorPicked(30); + assertThat(habit1.getColor(), equalTo(30)); + } + + @Test + public void onDeleteHabits() throws Exception + { + Long id = habit1.getId(); + assertNotNull(id); + assertNotNull(habitList.getById(id)); + when(adapter.getSelected()).thenReturn(singletonList(habit1)); + + behavior.onDeleteHabits(); + + verify(screen).showDeleteConfirmationScreen(deleteCallback.capture()); + deleteCallback.getValue().onConfirmed(); + assertNull(habitList.getById(id)); + } + + @Test + public void onEditHabits() throws Exception + { + List selected = asList(habit1, habit2); + when(adapter.getSelected()).thenReturn(selected); + behavior.onEditHabits(); + verify(screen).showEditHabitsScreen(selected); + } + + @Test + public void onUnarchiveHabits() throws Exception + { + assertTrue(habit1.isArchived()); + when(adapter.getSelected()).thenReturn(singletonList(habit1)); + behavior.onUnarchiveHabits(); + assertFalse(habit1.isArchived()); + } + + @Override + public void setUp() + { + super.setUp(); + + habit1 = fixtures.createShortHabit(); + habit1.setArchived(true); + habit2 = fixtures.createShortHabit(); + habit3 = fixtures.createShortHabit(); + habitList.add(habit1); + habitList.add(habit2); + habitList.add(habit3); + + behavior = + new ListHabitsSelectionMenuBehavior(habitList, screen, adapter, + commandRunner); + } + +} diff --git a/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/screens/habits/show/ShowHabitMenuBehaviorTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/screens/habits/show/ShowHabitMenuBehaviorTest.java new file mode 100644 index 000000000..b0ca4d0ba --- /dev/null +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/ui/screens/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.core.ui.screens.habits.show; + +import org.isoron.uhabits.*; +import org.isoron.uhabits.core.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 diff --git a/app/src/test/java/org/isoron/uhabits/utils/DateUtilsTest.java b/uhabits-core/src/test/java/org/isoron/uhabits/core/utils/DateUtilsTest.java similarity index 98% rename from app/src/test/java/org/isoron/uhabits/utils/DateUtilsTest.java rename to uhabits-core/src/test/java/org/isoron/uhabits/core/utils/DateUtilsTest.java index dbb0df07e..963559054 100644 --- a/app/src/test/java/org/isoron/uhabits/utils/DateUtilsTest.java +++ b/uhabits-core/src/test/java/org/isoron/uhabits/core/utils/DateUtilsTest.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. * @@ -17,7 +17,7 @@ * with this program. If not, see . */ -package org.isoron.uhabits.utils; +package org.isoron.uhabits.core.utils; import org.isoron.uhabits.*; import org.junit.*;