mirror of https://github.com/iSoron/uhabits.git
commit
a0803966f9
@ -0,0 +1,89 @@
|
|||||||
|
package org.isoron.uhabits.ui;
|
||||||
|
|
||||||
|
import android.app.KeyguardManager;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.pm.PackageManager;
|
||||||
|
import android.os.IBinder;
|
||||||
|
import android.support.test.runner.AndroidJUnitRunner;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
|
||||||
|
public final class SystemHelper extends AndroidJUnitRunner
|
||||||
|
{
|
||||||
|
private static final String ANIMATION_PERMISSION = "android.permission.SET_ANIMATION_SCALE";
|
||||||
|
private static final float DISABLED = 0.0f;
|
||||||
|
private static final float DEFAULT = 1.0f;
|
||||||
|
|
||||||
|
private final Context context;
|
||||||
|
|
||||||
|
SystemHelper(Context context)
|
||||||
|
{
|
||||||
|
this.context = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
void unlockScreen()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
KeyguardManager mKeyGuardManager = (KeyguardManager) context
|
||||||
|
.getSystemService(Context.KEYGUARD_SERVICE);
|
||||||
|
KeyguardManager.KeyguardLock mLock = mKeyGuardManager.newKeyguardLock("lock");
|
||||||
|
mLock.disableKeyguard();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void disableAllAnimations()
|
||||||
|
{
|
||||||
|
Log.i("SystemAnimations", "Trying to disable animations");
|
||||||
|
int permStatus = context.checkCallingOrSelfPermission(ANIMATION_PERMISSION);
|
||||||
|
if (permStatus == PackageManager.PERMISSION_GRANTED)
|
||||||
|
setSystemAnimationsScale(DISABLED);
|
||||||
|
else
|
||||||
|
Log.e("SystemAnimations", "Permission denied");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void enableAllAnimations()
|
||||||
|
{
|
||||||
|
int permStatus = context.checkCallingOrSelfPermission(ANIMATION_PERMISSION);
|
||||||
|
if (permStatus == PackageManager.PERMISSION_GRANTED)
|
||||||
|
{
|
||||||
|
setSystemAnimationsScale(DEFAULT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setSystemAnimationsScale(float animationScale)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Class<?> windowManagerStubClazz = Class.forName("android.view.IWindowManager$Stub");
|
||||||
|
Method asInterface =
|
||||||
|
windowManagerStubClazz.getDeclaredMethod("asInterface", IBinder.class);
|
||||||
|
Class<?> serviceManagerClazz = Class.forName("android.os.ServiceManager");
|
||||||
|
Method getService = serviceManagerClazz.getDeclaredMethod("getService", String.class);
|
||||||
|
Class<?> windowManagerClazz = Class.forName("android.view.IWindowManager");
|
||||||
|
Method setAnimationScales =
|
||||||
|
windowManagerClazz.getDeclaredMethod("setAnimationScales", float[].class);
|
||||||
|
Method getAnimationScales = windowManagerClazz.getDeclaredMethod("getAnimationScales");
|
||||||
|
|
||||||
|
IBinder windowManagerBinder = (IBinder) getService.invoke(null, "window");
|
||||||
|
Object windowManagerObj = asInterface.invoke(null, windowManagerBinder);
|
||||||
|
float[] currentScales = (float[]) getAnimationScales.invoke(windowManagerObj);
|
||||||
|
for (int i = 0; i < currentScales.length; i++)
|
||||||
|
currentScales[i] = animationScale;
|
||||||
|
|
||||||
|
setAnimationScales.invoke(windowManagerObj, new Object[]{currentScales});
|
||||||
|
Log.i("SystemAnimations", "All animations successfully disabled");
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Log.e("SystemAnimations",
|
||||||
|
"Could not change animation scale to " + animationScale + " :'(");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,148 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
|
||||||
|
*
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.isoron.uhabits.unit.models;
|
||||||
|
|
||||||
|
import android.support.test.runner.AndroidJUnit4;
|
||||||
|
import android.test.suitebuilder.annotation.SmallTest;
|
||||||
|
|
||||||
|
import org.isoron.helpers.DateHelper;
|
||||||
|
import org.isoron.uhabits.models.Habit;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
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.models.Checkmark.CHECKED_IMPLICITLY;
|
||||||
|
import static org.isoron.uhabits.models.Checkmark.UNCHECKED;
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4.class)
|
||||||
|
@SmallTest
|
||||||
|
public class CheckmarkListTest
|
||||||
|
{
|
||||||
|
Habit nonDailyHabit;
|
||||||
|
private Habit emptyHabit;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void prepare()
|
||||||
|
{
|
||||||
|
HabitFixtures.purgeHabits();
|
||||||
|
DateHelper.setFixedLocalTime(HabitFixtures.FIXED_LOCAL_TIME);
|
||||||
|
nonDailyHabit = HabitFixtures.createNonDailyHabit();
|
||||||
|
emptyHabit = HabitFixtures.createEmptyHabit();
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void tearDown()
|
||||||
|
{
|
||||||
|
DateHelper.setFixedLocalTime(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getAllValues_testNonDailyHabit()
|
||||||
|
{
|
||||||
|
int[] expectedValues = { CHECKED_EXPLICITLY, UNCHECKED, CHECKED_IMPLICITLY,
|
||||||
|
CHECKED_EXPLICITLY, CHECKED_EXPLICITLY, CHECKED_EXPLICITLY, UNCHECKED,
|
||||||
|
CHECKED_IMPLICITLY, CHECKED_EXPLICITLY, CHECKED_EXPLICITLY };
|
||||||
|
|
||||||
|
int[] actualValues = nonDailyHabit.checkmarks.getAllValues();
|
||||||
|
|
||||||
|
assertThat(actualValues, equalTo(expectedValues));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getAllValues_testMoveForwardInTime()
|
||||||
|
{
|
||||||
|
travelInTime(3);
|
||||||
|
|
||||||
|
int[] expectedValues = { UNCHECKED, UNCHECKED, UNCHECKED, CHECKED_EXPLICITLY, UNCHECKED,
|
||||||
|
CHECKED_IMPLICITLY, CHECKED_EXPLICITLY, CHECKED_EXPLICITLY, CHECKED_EXPLICITLY,
|
||||||
|
UNCHECKED, CHECKED_IMPLICITLY, CHECKED_EXPLICITLY, CHECKED_EXPLICITLY };
|
||||||
|
|
||||||
|
int[] actualValues = nonDailyHabit.checkmarks.getAllValues();
|
||||||
|
|
||||||
|
assertThat(actualValues, equalTo(expectedValues));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getAllValues_testMoveBackwardsInTime()
|
||||||
|
{
|
||||||
|
travelInTime(-3);
|
||||||
|
|
||||||
|
int[] expectedValues = { CHECKED_EXPLICITLY, CHECKED_EXPLICITLY, CHECKED_EXPLICITLY,
|
||||||
|
UNCHECKED, CHECKED_IMPLICITLY, CHECKED_EXPLICITLY, CHECKED_EXPLICITLY };
|
||||||
|
|
||||||
|
int[] actualValues = nonDailyHabit.checkmarks.getAllValues();
|
||||||
|
|
||||||
|
assertThat(actualValues, equalTo(expectedValues));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getAllValues_testEmptyHabit()
|
||||||
|
{
|
||||||
|
int[] expectedValues = new int[0];
|
||||||
|
int[] actualValues = emptyHabit.checkmarks.getAllValues();
|
||||||
|
|
||||||
|
assertThat(actualValues, equalTo(expectedValues));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getValues_testInvalidInterval()
|
||||||
|
{
|
||||||
|
int values[] = nonDailyHabit.checkmarks.getValues(100L, -100L);
|
||||||
|
assertThat(values, equalTo(new int[0]));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getValues_testValidInterval()
|
||||||
|
{
|
||||||
|
long from = DateHelper.getStartOfToday() - 15 * DateHelper.millisecondsInOneDay;
|
||||||
|
long to = DateHelper.getStartOfToday() - 5 * DateHelper.millisecondsInOneDay;
|
||||||
|
|
||||||
|
int[] expectedValues = { CHECKED_EXPLICITLY, UNCHECKED, CHECKED_IMPLICITLY,
|
||||||
|
CHECKED_EXPLICITLY, CHECKED_EXPLICITLY, UNCHECKED, UNCHECKED, UNCHECKED, UNCHECKED,
|
||||||
|
UNCHECKED, UNCHECKED };
|
||||||
|
|
||||||
|
int[] actualValues = nonDailyHabit.checkmarks.getValues(from, to);
|
||||||
|
|
||||||
|
assertThat(actualValues, equalTo(expectedValues));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getTodayValue_testNonDailyHabit()
|
||||||
|
{
|
||||||
|
travelInTime(-1);
|
||||||
|
assertThat(nonDailyHabit.checkmarks.getTodayValue(), equalTo(UNCHECKED));
|
||||||
|
|
||||||
|
travelInTime(0);
|
||||||
|
assertThat(nonDailyHabit.checkmarks.getTodayValue(), equalTo(CHECKED_EXPLICITLY));
|
||||||
|
|
||||||
|
travelInTime(1);
|
||||||
|
assertThat(nonDailyHabit.checkmarks.getTodayValue(), equalTo(UNCHECKED));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void travelInTime(int days)
|
||||||
|
{
|
||||||
|
DateHelper.setFixedLocalTime(HabitFixtures.FIXED_LOCAL_TIME +
|
||||||
|
days * DateHelper.millisecondsInOneDay);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
|
||||||
|
*
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.isoron.uhabits.unit.models;
|
||||||
|
|
||||||
|
import org.isoron.helpers.DateHelper;
|
||||||
|
import org.isoron.uhabits.models.Habit;
|
||||||
|
|
||||||
|
public class HabitFixtures
|
||||||
|
{
|
||||||
|
public static final long FIXED_LOCAL_TIME = 1422172800000L; // 8:00am, January 25th, 2015 (UTC)
|
||||||
|
public static boolean NON_DAILY_HABIT_CHECKS[] = { true, false, false, true, true, true, false,
|
||||||
|
false, true, true };
|
||||||
|
|
||||||
|
static Habit createNonDailyHabit()
|
||||||
|
{
|
||||||
|
Habit habit = new Habit();
|
||||||
|
habit.freqNum = 2;
|
||||||
|
habit.freqDen = 3;
|
||||||
|
habit.save();
|
||||||
|
|
||||||
|
long timestamp = DateHelper.getStartOfToday();
|
||||||
|
for(boolean c : NON_DAILY_HABIT_CHECKS)
|
||||||
|
{
|
||||||
|
if(c) habit.repetitions.toggle(timestamp);
|
||||||
|
timestamp -= DateHelper.millisecondsInOneDay;
|
||||||
|
}
|
||||||
|
|
||||||
|
return habit;
|
||||||
|
}
|
||||||
|
|
||||||
|
static Habit createEmptyHabit()
|
||||||
|
{
|
||||||
|
Habit habit = new Habit();
|
||||||
|
habit.save();
|
||||||
|
return habit;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void purgeHabits()
|
||||||
|
{
|
||||||
|
for(Habit h : Habit.getAll(true))
|
||||||
|
h.cascadeDelete();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,95 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
|
||||||
|
*
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.isoron.uhabits.unit.models;
|
||||||
|
|
||||||
|
import android.support.test.runner.AndroidJUnit4;
|
||||||
|
import android.test.suitebuilder.annotation.SmallTest;
|
||||||
|
|
||||||
|
import org.isoron.uhabits.models.Habit;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static org.hamcrest.Matchers.is;
|
||||||
|
import static org.junit.Assert.assertThat;
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4.class)
|
||||||
|
@SmallTest
|
||||||
|
public class HabitTest
|
||||||
|
{
|
||||||
|
@Before
|
||||||
|
public void prepare()
|
||||||
|
{
|
||||||
|
HabitFixtures.purgeHabits();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void reorderTest()
|
||||||
|
{
|
||||||
|
List<Long> ids = new LinkedList<>();
|
||||||
|
|
||||||
|
for (int i = 0; i < 10; i++)
|
||||||
|
{
|
||||||
|
Habit h = new Habit();
|
||||||
|
h.save();
|
||||||
|
ids.add(h.getId());
|
||||||
|
assertThat(h.position, is(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
int from = 5, to = 2;
|
||||||
|
int expectedPosition[] = {0, 1, 3, 4, 5, 2, 6, 7, 8, 9};
|
||||||
|
|
||||||
|
Habit fromHabit = Habit.get(ids.get(from));
|
||||||
|
Habit toHabit = Habit.get(ids.get(to));
|
||||||
|
Habit.reorder(fromHabit, toHabit);
|
||||||
|
|
||||||
|
for (int i = 0; i < 10; i++)
|
||||||
|
{
|
||||||
|
Habit h = Habit.get(ids.get(i));
|
||||||
|
assertThat(h.position, is(expectedPosition[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void rebuildOrderTest()
|
||||||
|
{
|
||||||
|
List<Long> ids = new LinkedList<>();
|
||||||
|
int originalPositions[] = { 0, 1, 1, 4, 6, 8, 10, 10, 13};
|
||||||
|
|
||||||
|
for (int p : originalPositions)
|
||||||
|
{
|
||||||
|
Habit h = new Habit();
|
||||||
|
h.position = p;
|
||||||
|
h.save();
|
||||||
|
ids.add(h.getId());
|
||||||
|
}
|
||||||
|
|
||||||
|
Habit.rebuildOrder();
|
||||||
|
|
||||||
|
for (int i = 0; i < originalPositions.length; i++)
|
||||||
|
{
|
||||||
|
Habit h = Habit.get(ids.get(i));
|
||||||
|
assertThat(h.position, is(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,162 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
|
||||||
|
*
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.isoron.uhabits.unit.models;
|
||||||
|
|
||||||
|
import android.support.test.runner.AndroidJUnit4;
|
||||||
|
import android.test.suitebuilder.annotation.SmallTest;
|
||||||
|
|
||||||
|
import org.isoron.helpers.DateHelper;
|
||||||
|
import org.isoron.uhabits.models.Habit;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Calendar;
|
||||||
|
import java.util.GregorianCalendar;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
import static org.hamcrest.MatcherAssert.assertThat;
|
||||||
|
import static org.hamcrest.Matchers.equalTo;
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4.class)
|
||||||
|
@SmallTest
|
||||||
|
public class RepetitionListTest
|
||||||
|
{
|
||||||
|
Habit habit;
|
||||||
|
private Habit emptyHabit;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void prepare()
|
||||||
|
{
|
||||||
|
HabitFixtures.purgeHabits();
|
||||||
|
DateHelper.setFixedLocalTime(HabitFixtures.FIXED_LOCAL_TIME);
|
||||||
|
habit = HabitFixtures.createNonDailyHabit();
|
||||||
|
emptyHabit = HabitFixtures.createEmptyHabit();
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void tearDown()
|
||||||
|
{
|
||||||
|
DateHelper.setFixedLocalTime(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void contains_testNonDailyHabit()
|
||||||
|
{
|
||||||
|
long current = DateHelper.getStartOfToday();
|
||||||
|
|
||||||
|
for(boolean b : HabitFixtures.NON_DAILY_HABIT_CHECKS)
|
||||||
|
{
|
||||||
|
assertThat(habit.repetitions.contains(current), equalTo(b));
|
||||||
|
current -= DateHelper.millisecondsInOneDay;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i = 0; i < 3; i++)
|
||||||
|
{
|
||||||
|
assertThat(habit.repetitions.contains(current), equalTo(false));
|
||||||
|
current -= DateHelper.millisecondsInOneDay;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void delete_test()
|
||||||
|
{
|
||||||
|
long timestamp = DateHelper.getStartOfToday();
|
||||||
|
assertThat(habit.repetitions.contains(timestamp), equalTo(true));
|
||||||
|
|
||||||
|
habit.repetitions.delete(timestamp);
|
||||||
|
assertThat(habit.repetitions.contains(timestamp), equalTo(false));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void toggle_test()
|
||||||
|
{
|
||||||
|
long timestamp = DateHelper.getStartOfToday();
|
||||||
|
assertThat(habit.repetitions.contains(timestamp), equalTo(true));
|
||||||
|
|
||||||
|
habit.repetitions.toggle(timestamp);
|
||||||
|
assertThat(habit.repetitions.contains(timestamp), equalTo(false));
|
||||||
|
|
||||||
|
habit.repetitions.toggle(timestamp);
|
||||||
|
assertThat(habit.repetitions.contains(timestamp), equalTo(true));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getWeekDayFrequency_test()
|
||||||
|
{
|
||||||
|
Random random = new Random();
|
||||||
|
Integer weekdayCount[][] = new Integer[12][7];
|
||||||
|
Integer monthCount[] = new Integer[12];
|
||||||
|
|
||||||
|
Arrays.fill(monthCount, 0);
|
||||||
|
for(Integer row[] : weekdayCount)
|
||||||
|
Arrays.fill(row, 0);
|
||||||
|
|
||||||
|
GregorianCalendar day = DateHelper.getStartOfTodayCalendar();
|
||||||
|
|
||||||
|
// Sets the current date to the end of November
|
||||||
|
day.set(2015, 10, 30);
|
||||||
|
DateHelper.setFixedLocalTime(day.getTimeInMillis());
|
||||||
|
|
||||||
|
// Add repetitions randomly from January to December
|
||||||
|
// Leaves the month of March empty, to check that it returns null
|
||||||
|
day.set(2015, 0, 1);
|
||||||
|
for(int i = 0; i < 365; i ++)
|
||||||
|
{
|
||||||
|
if(random.nextBoolean())
|
||||||
|
{
|
||||||
|
int month = day.get(Calendar.MONTH);
|
||||||
|
int week = day.get(Calendar.DAY_OF_WEEK) % 7;
|
||||||
|
|
||||||
|
if(month != 2)
|
||||||
|
{
|
||||||
|
if (month <= 10)
|
||||||
|
{
|
||||||
|
weekdayCount[month][week]++;
|
||||||
|
monthCount[month]++;
|
||||||
|
}
|
||||||
|
emptyHabit.repetitions.toggle(day.getTimeInMillis());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
day.add(Calendar.DAY_OF_YEAR, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
HashMap<Long, Integer[]> freq = emptyHabit.repetitions.getWeekdayFrequency();
|
||||||
|
|
||||||
|
// Repetitions until November should be counted correctly
|
||||||
|
for(int month = 0; month < 11; month++)
|
||||||
|
{
|
||||||
|
day.set(2015, month, 1);
|
||||||
|
Integer actualCount[] = freq.get(day.getTimeInMillis());
|
||||||
|
if(monthCount[month] == 0)
|
||||||
|
assertThat(actualCount, equalTo(null));
|
||||||
|
else
|
||||||
|
assertThat(actualCount, equalTo(weekdayCount[month]));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Repetitions in December should be discarded
|
||||||
|
day.set(2015, 11, 1);
|
||||||
|
assertThat(freq.get(day.getTimeInMillis()), equalTo(null));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
|
||||||
|
~
|
||||||
|
~ 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 <http://www.gnu.org/licenses/>.
|
||||||
|
-->
|
||||||
|
<manifest
|
||||||
|
package="org.isoron.uhabits"
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.SET_ANIMATION_SCALE"/>
|
||||||
|
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
|
||||||
|
|
||||||
|
</manifest>
|
@ -0,0 +1,78 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016 Álinson Santos Xavier <isoron@gmail.com>
|
||||||
|
*
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.isoron.uhabits;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
|
|
||||||
|
import com.activeandroid.ActiveAndroid;
|
||||||
|
import com.activeandroid.Configuration;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
public class HabitsApplication extends Application
|
||||||
|
{
|
||||||
|
private boolean isTestMode()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
getClassLoader().loadClass("org.isoron.uhabits.unit.models.HabitTest");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (final Exception e)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void deleteDB(String databaseFilename)
|
||||||
|
{
|
||||||
|
File databaseFile = new File(String.format("%s/../databases/%s",
|
||||||
|
getApplicationContext().getFilesDir().getPath(), databaseFilename));
|
||||||
|
|
||||||
|
if(databaseFile.exists()) databaseFile.delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate()
|
||||||
|
{
|
||||||
|
super.onCreate();
|
||||||
|
String databaseFilename = BuildConfig.databaseFilename;
|
||||||
|
|
||||||
|
if (isTestMode())
|
||||||
|
{
|
||||||
|
databaseFilename = "test.db";
|
||||||
|
deleteDB(databaseFilename);
|
||||||
|
}
|
||||||
|
|
||||||
|
Configuration dbConfig = new Configuration.Builder(this)
|
||||||
|
.setDatabaseName(databaseFilename)
|
||||||
|
.setDatabaseVersion(BuildConfig.databaseVersion)
|
||||||
|
.create();
|
||||||
|
|
||||||
|
ActiveAndroid.initialize(dbConfig);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTerminate()
|
||||||
|
{
|
||||||
|
ActiveAndroid.dispose();
|
||||||
|
super.onTerminate();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
checkout:
|
||||||
|
post:
|
||||||
|
- git submodule sync
|
||||||
|
- git submodule update --init
|
||||||
|
|
||||||
|
test:
|
||||||
|
override:
|
||||||
|
- emulator -avd circleci-android22 -no-audio -no-window:
|
||||||
|
background: true
|
||||||
|
parallel: true
|
||||||
|
- circle-android wait-for-boot
|
||||||
|
- adb shell input keyevent 82
|
||||||
|
- ./gradlew connectedAndroidTest
|
||||||
|
- cp -r app/build/outputs $CIRCLE_ARTIFACTS || echo ok
|
||||||
|
- cp -r app/build/reports/androidTests/connected/* $CIRCLE_TEST_REPORTS || echo ok
|
@ -1 +1 @@
|
|||||||
Subproject commit 318d69cf6b2adc287cf8944bb847dd7139c60376
|
Subproject commit 54ca667d4cfb0e38d0c9df816360059ac0675afe
|
Loading…
Reference in new issue