diff --git a/app/build.gradle b/app/build.gradle
index c9fd8891..bc9259a0 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -78,7 +78,7 @@ dependencies {
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.recyclerview:recyclerview:1.0.0'
- implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0-alpha04'
+ implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0-alpha05'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.exifinterface:exifinterface:1.1.0-beta01'
implementation 'com.google.android.material:material:1.0.0'
diff --git a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicActivity.java b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicActivity.java
index b5349d0b..2a9defb9 100644
--- a/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicActivity.java
+++ b/app/src/main/java/gr/thmmy/mthmmy/activities/topic/TopicActivity.java
@@ -5,7 +5,6 @@ import android.app.NotificationManager;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
-import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Rect;
diff --git a/app/src/main/java/gr/thmmy/mthmmy/utils/DateTimeUtils.java b/app/src/main/java/gr/thmmy/mthmmy/utils/DateTimeUtils.java
index 7802f931..a758769d 100644
--- a/app/src/main/java/gr/thmmy/mthmmy/utils/DateTimeUtils.java
+++ b/app/src/main/java/gr/thmmy/mthmmy/utils/DateTimeUtils.java
@@ -1,5 +1,7 @@
package gr.thmmy.mthmmy.utils;
+import androidx.annotation.VisibleForTesting;
+
import static android.text.format.DateUtils.DAY_IN_MILLIS;
import static android.text.format.DateUtils.HOUR_IN_MILLIS;
import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
@@ -20,38 +22,55 @@ public class DateTimeUtils {
return dateTime;
}
- private static final long MONTH_IN_MILLIS = DAY_IN_MILLIS*30;
- private static final long DECADE_IN_MILLIS = YEAR_IN_MILLIS*10;
+ private static final long MONTH_IN_MILLIS = 30*DAY_IN_MILLIS;
+ private static final long DECADE_IN_MILLIS = 10*YEAR_IN_MILLIS;
+
+ @VisibleForTesting
+ static String getRelativeTimeSpanString(long time) {
+ long now = System.currentTimeMillis();
- static CharSequence getRelativeTimeSpanString(long time, long now, long minResolution) {
boolean past = (now >= time);
long duration = Math.abs(now - time);
String format;
- long count;
- if (duration < MINUTE_IN_MILLIS && minResolution < MINUTE_IN_MILLIS) {
- count = duration / SECOND_IN_MILLIS;
- format = "%d sec";
- } else if (duration < HOUR_IN_MILLIS && minResolution < HOUR_IN_MILLIS) {
- count = duration / MINUTE_IN_MILLIS;
- format = "%d min";
- } else if (duration < DAY_IN_MILLIS && minResolution < DAY_IN_MILLIS) {
- count = duration / HOUR_IN_MILLIS;
- format = "%d hour";
- if(count>1)
- format = format + 's';
- } else if (duration < MONTH_IN_MILLIS && minResolution < MONTH_IN_MILLIS) {
- count = duration / DAY_IN_MILLIS;
+ long count, mod;
+ if(duration < 45*SECOND_IN_MILLIS)
+ return "just now";
+ else if (duration < 45*MINUTE_IN_MILLIS) {
+ count = duration/MINUTE_IN_MILLIS;
+ mod = duration % MINUTE_IN_MILLIS;
+ if(mod >= 30*SECOND_IN_MILLIS)
+ count += 1;
+ format = "%dm";
+ } else if (duration < 22*HOUR_IN_MILLIS) {
+ count = duration/HOUR_IN_MILLIS;
+ format = "%dh";
+ mod = (duration%HOUR_IN_MILLIS)/MINUTE_IN_MILLIS;
+ if(count<4 && mod>10 && mod<50)
+ format = format + mod +"m";
+ else if(mod >= 30)
+ count += 1;
+ } else if (duration < 26*DAY_IN_MILLIS) {
+ count = duration/DAY_IN_MILLIS;
format = "%d day";
+ mod = duration % DAY_IN_MILLIS;
+ if(mod >= 12*HOUR_IN_MILLIS)
+ count += 1;
if(count>1)
format = format + 's';
- } else if (duration < YEAR_IN_MILLIS && minResolution < YEAR_IN_MILLIS) {
- count = duration / MONTH_IN_MILLIS;
+ } else if (duration < 320*DAY_IN_MILLIS) {
+ count = duration/MONTH_IN_MILLIS;
format = "%d month";
+ mod = duration % MONTH_IN_MILLIS;
+ if(mod >= 15*DAY_IN_MILLIS)
+ count += 1;
if(count>1)
format = format + 's';
- } else if (duration < DECADE_IN_MILLIS && minResolution < DECADE_IN_MILLIS) {
- count = duration / YEAR_IN_MILLIS;
+ } else if (duration < DECADE_IN_MILLIS) {
+ count = duration/YEAR_IN_MILLIS;
format = "%d year";
+ mod = duration % YEAR_IN_MILLIS;
+ if(mod >= 183*DAY_IN_MILLIS)
+ count += 1;
if(count>1)
format = format + 's';
}
diff --git a/app/src/main/java/gr/thmmy/mthmmy/utils/RelativeTimeTextView.java b/app/src/main/java/gr/thmmy/mthmmy/utils/RelativeTimeTextView.java
index 083408c4..9b5b5f74 100644
--- a/app/src/main/java/gr/thmmy/mthmmy/utils/RelativeTimeTextView.java
+++ b/app/src/main/java/gr/thmmy/mthmmy/utils/RelativeTimeTextView.java
@@ -100,24 +100,7 @@ public class RelativeTimeTextView extends TextView {
*/
if (this.mReferenceTime == -1L)
return;
- setText(getRelativeTimeDisplayString(mReferenceTime, System.currentTimeMillis()));
- }
-
- /**
- * Get the text to display for relative time.
- *
- * @param referenceTime The reference time passed in through {@link #setReferenceTime(long)} or through {@code reference_time} attribute
- * @param now The current time
- * @return The display text for the relative time
- */
- protected CharSequence getRelativeTimeDisplayString(long referenceTime, long now) {
- long difference = now - referenceTime;
- return (difference >= 0 && difference<=DateUtils.MINUTE_IN_MILLIS) ?
- "just now" :
- getRelativeTimeSpanString(
- mReferenceTime,
- now,
- DateUtils.MINUTE_IN_MILLIS);
+ setText(getRelativeTimeSpanString(mReferenceTime));
}
@Override
diff --git a/app/src/test/java/gr/thmmy/mthmmy/utils/DateTimeUtilsTest.java b/app/src/test/java/gr/thmmy/mthmmy/utils/DateTimeUtilsTest.java
new file mode 100644
index 00000000..1a3eaa2b
--- /dev/null
+++ b/app/src/test/java/gr/thmmy/mthmmy/utils/DateTimeUtilsTest.java
@@ -0,0 +1,106 @@
+package gr.thmmy.mthmmy.utils;
+
+import net.lachlanmckee.timberjunit.TimberTestRule;
+
+import org.joda.time.DateTime;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import static gr.thmmy.mthmmy.utils.DateTimeUtils.getRelativeTimeSpanString;
+import static org.junit.Assert.assertArrayEquals;
+import static org.mockito.Mockito.when;
+
+@RunWith(PowerMockRunner.class)
+@PrepareForTest(DateTimeUtils.class)
+public class DateTimeUtilsTest {
+ @Rule
+ public TimberTestRule logAllAlwaysRule = TimberTestRule.logAllAlways();
+
+ private final long NOW = System.currentTimeMillis();
+ private final String [] expectedRelativeTimeSpans = {
+ "just now",
+ "just now",
+ "just now",
+ "1m",
+ "1m",
+ "1m",
+ "2m",
+ "3m",
+ "1h",
+ "1h15m",
+ "2h",
+ "3h20m",
+ "4h",
+ "20h",
+ "21h",
+ "21h",
+ "21h",
+ "22h",
+ "1 day",
+ "1 day",
+ "2 days",
+ "2 days",
+ "3 days",
+ "16 days",
+ "1 month",
+ "2 months",
+ "1 year",
+ "1 year",
+ "2 years",
+ "a long time ago"
+ };
+
+ private final long [] times = {
+ NOW,
+ newDT().minusSeconds(44).getMillis(),
+ newDT().minusSeconds(44).minusMillis(500).getMillis(),
+ newDT().minusSeconds(45).getMillis(),
+ newDT().minusSeconds(89).getMillis(),
+ newDT().minusSeconds(89).minusMillis(500).getMillis(),
+ newDT().minusSeconds(90).getMillis(),
+ newDT().minusMinutes(3).minusSeconds(10).getMillis(),
+ newDT().minusHours(1).minusMinutes(4).getMillis(),
+ newDT().minusHours(1).minusMinutes(15).getMillis(),
+ newDT().minusHours(2).minusMinutes(4).getMillis(),
+ newDT().minusHours(3).minusMinutes(20).getMillis(),
+ newDT().minusHours(3).minusMinutes(51).getMillis(),
+ newDT().minusHours(20).minusMinutes(10).getMillis(),
+ newDT().minusHours(20).minusMinutes(30).getMillis(),
+ newDT().minusHours(21).getMillis(),
+ newDT().minusHours(21).minusMinutes(29).getMillis(),
+ newDT().minusHours(21).minusMinutes(30).getMillis(),
+ newDT().minusHours(22).minusMinutes(30).getMillis(),
+ newDT().minusHours(34).getMillis(),
+ newDT().minusHours(38).getMillis(),
+ newDT().minusDays(2).minusHours(10).getMillis(),
+ newDT().minusDays(2).minusHours(17).getMillis(),
+ newDT().minusDays(16).getMillis(),
+ newDT().minusDays(30+12).getMillis(),
+ newDT().minusDays(2*30+14).getMillis(),
+ newDT().minusDays(14*30).getMillis(),
+ newDT().minusMonths(15).getMillis(),
+ newDT().minusMonths(22).getMillis(),
+ newDT().minusYears(22).getMillis()
+ };
+
+ private DateTime newDT(){
+ return new DateTime(NOW);
+ }
+
+ @Test
+ public void relativeTimeSpansAreConvertedCorrectly() {
+ PowerMockito.mockStatic(System.class);
+ when(System.currentTimeMillis()).thenReturn(NOW);
+
+ String[] timeStrings = new String[times.length];
+
+ for(int i=0; i