From 7bb88dcb97f7ddbab535bfde78633f9dd6df5462 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Sat, 30 Sep 2017 12:59:02 -0500 Subject: [PATCH 1/4] Bump version and update CHANGELOG --- CHANGELOG.md | 4 ++++ app/src/main/AndroidManifest.xml | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e21cd4365..16887c998 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +### 1.7.7 (September 30, 2017) + +* Fix bug that caused reminders to show repeatedly on DST changes + ### 1.7.6 (July 18, 2017) * Fix bug that caused widgets not to render sometimes diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8491ec533..01a51114a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -21,8 +21,8 @@ + android:versionCode="34" + android:versionName="1.7.7"> From 16f20d50a04cb5f2abde513f5cc14e1725fd326a Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Sat, 30 Sep 2017 13:11:40 -0500 Subject: [PATCH 2/4] Fix bug that caused reminders to keep repeating every few seconds Fixes #351 --- .../org/isoron/uhabits/utils/DateUtils.java | 6 +- .../java/org/isoron/uhabits/BaseUnitTest.java | 7 ++ .../isoron/uhabits/utils/DateUtilsTest.java | 85 +++++++++++++++++++ 3 files changed, 94 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/isoron/uhabits/utils/DateUtils.java b/app/src/main/java/org/isoron/uhabits/utils/DateUtils.java index cce452145..e0b7313ba 100644 --- a/app/src/main/java/org/isoron/uhabits/utils/DateUtils.java +++ b/app/src/main/java/org/isoron/uhabits/utils/DateUtils.java @@ -42,8 +42,7 @@ public abstract class DateUtils public static long applyTimezone(long localTimestamp) { TimeZone tz = getTimezone(); - long now = new Date(localTimestamp).getTime(); - return now - tz.getOffset(now); + return localTimestamp - tz.getOffset(localTimestamp - tz.getOffset(localTimestamp)); } public static String formatHeaderDate(GregorianCalendar day) @@ -230,8 +229,7 @@ public static int javaWeekdayToLoopWeekday(int number) public static long removeTimezone(long timestamp) { TimeZone tz = getTimezone(); - long now = new Date(timestamp).getTime(); - return now + tz.getOffset(now); + return timestamp + tz.getOffset(timestamp); } public static void setFixedLocalTime(Long timestamp) diff --git a/app/src/test/java/org/isoron/uhabits/BaseUnitTest.java b/app/src/test/java/org/isoron/uhabits/BaseUnitTest.java index 5bd3d841a..562d93035 100644 --- a/app/src/test/java/org/isoron/uhabits/BaseUnitTest.java +++ b/app/src/test/java/org/isoron/uhabits/BaseUnitTest.java @@ -58,4 +58,11 @@ public long timestamp(int year, int month, int day) cal.set(year, month, day); return cal.getTimeInMillis(); } + + public long timestamp(int year, int month, int day, int hourOfDay, int minute, int second) + { + GregorianCalendar cal = DateUtils.getStartOfTodayCalendar(); + cal.set(year, month, day, hourOfDay, minute, second); + return cal.getTimeInMillis(); + } } diff --git a/app/src/test/java/org/isoron/uhabits/utils/DateUtilsTest.java b/app/src/test/java/org/isoron/uhabits/utils/DateUtilsTest.java index dbb0df07e..3656ce5ba 100644 --- a/app/src/test/java/org/isoron/uhabits/utils/DateUtilsTest.java +++ b/app/src/test/java/org/isoron/uhabits/utils/DateUtilsTest.java @@ -25,8 +25,11 @@ import java.util.*; import static java.util.Calendar.*; +import static junit.framework.Assert.assertEquals; import static org.hamcrest.CoreMatchers.*; import static org.hamcrest.MatcherAssert.*; +import static org.isoron.uhabits.utils.DateUtils.applyTimezone; +import static org.isoron.uhabits.utils.DateUtils.removeTimezone; public class DateUtilsTest extends BaseUnitTest { @@ -147,4 +150,86 @@ public void test_getDaysBetween() assertThat(DateUtils.getDaysBetween(t1, t3), equalTo(365)); assertThat(DateUtils.getDaysBetween(t3, t1), equalTo(365)); } + + @Test + public void test_applyTimezone() + { + DateUtils.setFixedTimeZone(TimeZone.getTimeZone("Australia/Sydney")); + assertEquals(applyTimezone(timestamp(2017, JULY, 30, 18, 0, 0)), (timestamp(2017, JULY, 30, 8, 0, 0))); + assertEquals(applyTimezone(timestamp(2017, SEPTEMBER, 30, 0, 0, 0)), (timestamp(2017, SEPTEMBER, 29, 14, 0, 0))); + assertEquals(applyTimezone(timestamp(2017, SEPTEMBER, 30, 10, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 0, 0, 0))); + assertEquals(applyTimezone(timestamp(2017, SEPTEMBER, 30, 11, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 1, 0, 0))); + assertEquals(applyTimezone(timestamp(2017, SEPTEMBER, 30, 12, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 2, 0, 0))); + assertEquals(applyTimezone(timestamp(2017, SEPTEMBER, 30, 13, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 3, 0, 0))); + assertEquals(applyTimezone(timestamp(2017, SEPTEMBER, 30, 22, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 12, 0, 0))); + assertEquals(applyTimezone(timestamp(2017, SEPTEMBER, 30, 23, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 13, 0, 0))); + assertEquals(applyTimezone(timestamp(2017, OCTOBER, 1, 0, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 14, 0, 0))); + assertEquals(applyTimezone(timestamp(2017, OCTOBER, 1, 1, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 15, 0, 0))); + assertEquals(applyTimezone(timestamp(2017, OCTOBER, 1, 1, 59, 0)), (timestamp(2017, SEPTEMBER, 30, 15, 59, 0))); + // DST begins + assertEquals(applyTimezone(timestamp(2017, OCTOBER, 1, 3, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 16, 0, 0))); + assertEquals(applyTimezone(timestamp(2017, OCTOBER, 1, 4, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 17, 0, 0))); + assertEquals(applyTimezone(timestamp(2017, OCTOBER, 1, 5, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 18, 0, 0))); + assertEquals(applyTimezone(timestamp(2017, OCTOBER, 1, 11, 0, 0)), (timestamp(2017, OCTOBER, 1, 0, 0, 0))); + assertEquals(applyTimezone(timestamp(2017, OCTOBER, 1, 12, 0, 0)), (timestamp(2017, OCTOBER, 1, 1, 0, 0))); + assertEquals(applyTimezone(timestamp(2017, OCTOBER, 1, 13, 0, 0)), (timestamp(2017, OCTOBER, 1, 2, 0, 0))); + assertEquals(applyTimezone(timestamp(2017, OCTOBER, 1, 14, 0, 0)), (timestamp(2017, OCTOBER, 1, 3, 0, 0))); + assertEquals(applyTimezone(timestamp(2017, OCTOBER, 1, 15, 0, 0)), (timestamp(2017, OCTOBER, 1, 4, 0, 0))); + assertEquals(applyTimezone(timestamp(2017, OCTOBER, 1, 19, 0, 0)), (timestamp(2017, OCTOBER, 1, 8, 0, 0))); + assertEquals(applyTimezone(timestamp(2017, OCTOBER, 2, 19, 0, 0)), (timestamp(2017, OCTOBER, 2, 8, 0, 0))); + assertEquals(applyTimezone(timestamp(2017, NOVEMBER, 30, 19, 0, 0)), (timestamp(2017, NOVEMBER, 30, 8, 0, 0))); + assertEquals(applyTimezone(timestamp(2018, MARCH, 31, 0, 0, 0)), (timestamp(2018, MARCH, 30, 13, 0, 0))); + assertEquals(applyTimezone(timestamp(2018, MARCH, 31, 12, 0, 0)), (timestamp(2018, MARCH, 31, 1, 0, 0))); + assertEquals(applyTimezone(timestamp(2018, MARCH, 31, 18, 0, 0)), (timestamp(2018, MARCH, 31, 7, 0, 0))); + assertEquals(applyTimezone(timestamp(2018, APRIL, 1, 0, 0, 0)), (timestamp(2018, MARCH, 31, 13, 0, 0))); + assertEquals(applyTimezone(timestamp(2018, APRIL, 1, 1, 0, 0)), (timestamp(2018, MARCH, 31, 14, 0, 0))); + assertEquals(applyTimezone(timestamp(2018, APRIL, 1, 1, 59, 0)), (timestamp(2018, MARCH, 31, 14, 59, 0))); + // DST ends + assertEquals(applyTimezone(timestamp(2018, APRIL, 1, 2, 0, 0)), (timestamp(2018, MARCH, 31, 16, 0, 0))); + assertEquals(applyTimezone(timestamp(2018, APRIL, 1, 3, 0, 0)), (timestamp(2018, MARCH, 31, 17, 0, 0))); + assertEquals(applyTimezone(timestamp(2018, APRIL, 1, 4, 0, 0)), (timestamp(2018, MARCH, 31, 18, 0, 0))); + assertEquals(applyTimezone(timestamp(2018, APRIL, 1, 10, 0, 0)), (timestamp(2018, APRIL, 1, 0, 0, 0))); + assertEquals(applyTimezone(timestamp(2018, APRIL, 1, 18, 0, 0)), (timestamp(2018, APRIL, 1, 8, 0, 0))); + } + + @Test + public void test_removeTimezone() + { + DateUtils.setFixedTimeZone(TimeZone.getTimeZone("Australia/Sydney")); + assertEquals(removeTimezone(timestamp(2017, JULY, 30, 8, 0, 0)), (timestamp(2017, JULY, 30, 18, 0, 0))); + assertEquals(removeTimezone(timestamp(2017, SEPTEMBER, 29, 14, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 0, 0, 0))); + assertEquals(removeTimezone(timestamp(2017, SEPTEMBER, 30, 0, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 10, 0, 0))); + assertEquals(removeTimezone(timestamp(2017, SEPTEMBER, 30, 1, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 11, 0, 0))); + assertEquals(removeTimezone(timestamp(2017, SEPTEMBER, 30, 2, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 12, 0, 0))); + assertEquals(removeTimezone(timestamp(2017, SEPTEMBER, 30, 3, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 13, 0, 0))); + assertEquals(removeTimezone(timestamp(2017, SEPTEMBER, 30, 12, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 22, 0, 0))); + assertEquals(removeTimezone(timestamp(2017, SEPTEMBER, 30, 13, 0, 0)), (timestamp(2017, SEPTEMBER, 30, 23, 0, 0))); + assertEquals(removeTimezone(timestamp(2017, SEPTEMBER, 30, 14, 0, 0)), (timestamp(2017, OCTOBER, 1, 0, 0, 0))); + assertEquals(removeTimezone(timestamp(2017, SEPTEMBER, 30, 15, 0, 0)), (timestamp(2017, OCTOBER, 1, 1, 0, 0))); + assertEquals(removeTimezone(timestamp(2017, SEPTEMBER, 30, 15, 59, 0)), (timestamp(2017, OCTOBER, 1, 1, 59, 0))); + // DST begins + assertEquals(removeTimezone(timestamp(2017, SEPTEMBER, 30, 16, 0, 0)), (timestamp(2017, OCTOBER, 1, 3, 0, 0))); + assertEquals(removeTimezone(timestamp(2017, SEPTEMBER, 30, 17, 0, 0)), (timestamp(2017, OCTOBER, 1, 4, 0, 0))); + assertEquals(removeTimezone(timestamp(2017, SEPTEMBER, 30, 18, 0, 0)), (timestamp(2017, OCTOBER, 1, 5, 0, 0))); + assertEquals(removeTimezone(timestamp(2017, OCTOBER, 1, 0, 0, 0)), (timestamp(2017, OCTOBER, 1, 11, 0, 0))); + assertEquals(removeTimezone(timestamp(2017, OCTOBER, 1, 1, 0, 0)), (timestamp(2017, OCTOBER, 1, 12, 0, 0))); + assertEquals(removeTimezone(timestamp(2017, OCTOBER, 1, 2, 0, 0)), (timestamp(2017, OCTOBER, 1, 13, 0, 0))); + assertEquals(removeTimezone(timestamp(2017, OCTOBER, 1, 3, 0, 0)), (timestamp(2017, OCTOBER, 1, 14, 0, 0))); + assertEquals(removeTimezone(timestamp(2017, OCTOBER, 1, 4, 0, 0)), (timestamp(2017, OCTOBER, 1, 15, 0, 0))); + assertEquals(removeTimezone(timestamp(2017, OCTOBER, 1, 8, 0, 0)), (timestamp(2017, OCTOBER, 1, 19, 0, 0))); + assertEquals(removeTimezone(timestamp(2017, OCTOBER, 2, 8, 0, 0)), (timestamp(2017, OCTOBER, 2, 19, 0, 0))); + assertEquals(removeTimezone(timestamp(2017, NOVEMBER, 30, 8, 0, 0)), (timestamp(2017, NOVEMBER, 30, 19, 0, 0))); + assertEquals(removeTimezone(timestamp(2018, MARCH, 30, 13, 0, 0)), (timestamp(2018, MARCH, 31, 0, 0, 0))); + assertEquals(removeTimezone(timestamp(2018, MARCH, 31, 1, 0, 0)), (timestamp(2018, MARCH, 31, 12, 0, 0))); + assertEquals(removeTimezone(timestamp(2018, MARCH, 31, 7, 0, 0)), (timestamp(2018, MARCH, 31, 18, 0, 0))); + assertEquals(removeTimezone(timestamp(2018, MARCH, 31, 13, 0, 0)), (timestamp(2018, APRIL, 1, 0, 0, 0))); + assertEquals(removeTimezone(timestamp(2018, MARCH, 31, 14, 0, 0)), (timestamp(2018, APRIL, 1, 1, 0, 0))); + assertEquals(removeTimezone(timestamp(2018, MARCH, 31, 14, 59, 0)), (timestamp(2018, APRIL, 1, 1, 59, 0))); + // DST ends + assertEquals(removeTimezone(timestamp(2018, MARCH, 31, 16, 0, 0)), (timestamp(2018, APRIL, 1, 2, 0, 0))); + assertEquals(removeTimezone(timestamp(2018, MARCH, 31, 17, 0, 0)), (timestamp(2018, APRIL, 1, 3, 0, 0))); + assertEquals(removeTimezone(timestamp(2018, MARCH, 31, 18, 0, 0)), (timestamp(2018, APRIL, 1, 4, 0, 0))); + assertEquals(removeTimezone(timestamp(2018, APRIL, 1, 0, 0, 0)), (timestamp(2018, APRIL, 1, 10, 0, 0))); + assertEquals(removeTimezone(timestamp(2018, APRIL, 1, 8, 0, 0)), (timestamp(2018, APRIL, 1, 18, 0, 0))); + } } From c56b86d32cd876480bc9a8a93fc8c133091f4b26 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Sat, 30 Sep 2017 13:14:42 -0500 Subject: [PATCH 3/4] Bump version again The previous number was already in use by an alpha version --- app/src/main/AndroidManifest.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 01a51114a..10f380b86 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -21,8 +21,8 @@ + android:versionCode="35" + android:versionName="1.7.8"> From 657cde75d8ddc70d857c37bca36e99b7b5c65048 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Sat, 30 Sep 2017 13:18:26 -0500 Subject: [PATCH 4/4] Disable signing config --- app/build.gradle | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 888fee574..4d823549b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,14 +8,14 @@ android { compileSdkVersion 25 buildToolsVersion "25.0.2" - signingConfigs { - release { - storeFile file(LOOP_STORE_FILE) - storePassword LOOP_STORE_PASSWORD - keyAlias LOOP_KEY_ALIAS - keyPassword LOOP_KEY_PASSWORD - } - } +// signingConfigs { +// release { +// storeFile file(LOOP_STORE_FILE) +// storePassword LOOP_STORE_PASSWORD +// keyAlias LOOP_KEY_ALIAS +// keyPassword LOOP_KEY_PASSWORD +// } +// } playAccountConfigs { defaultAccountConfig { @@ -35,14 +35,14 @@ android { testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" testInstrumentationRunnerArgument "size", "medium" - playAccountConfig = playAccountConfigs.defaultAccountConfig +// playAccountConfig = playAccountConfigs.defaultAccountConfig } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' - signingConfig signingConfigs.release +// signingConfig signingConfigs.release } debug { testCoverageEnabled = false @@ -161,6 +161,6 @@ task coverageReport(type: JacocoReport, dependsOn: ['testDebugUnitTest']) { executionData = files(jvmExecData, connectedExecData) } -play { - track = 'alpha' -} +//play { +// track = 'alpha' +//}