Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix timestamps #1189

Draft
wants to merge 2 commits into
base: dev
Choose a base branch
from
Draft
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Fix timestamps
  • Loading branch information
bemusementpark committed May 12, 2023

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
commit 07d7530c830e68d5d37627c74250ea8e39b4acae
Original file line number Diff line number Diff line change
@@ -21,13 +21,21 @@
import org.session.libsession.utilities.dynamiclanguage.DynamicLanguageContextWrapper;
import org.thoughtcrime.securesms.conversation.v2.WindowUtil;
import org.thoughtcrime.securesms.util.ActivityUtilitiesKt;
import org.thoughtcrime.securesms.util.DateUtil;
import org.thoughtcrime.securesms.util.ThemeState;
import org.thoughtcrime.securesms.util.UiModeUtilities;

import javax.inject.Inject;

import dagger.hilt.android.AndroidEntryPoint;
import network.loki.messenger.R;

@AndroidEntryPoint
public abstract class BaseActionBarActivity extends AppCompatActivity {
private static final String TAG = BaseActionBarActivity.class.getSimpleName();

@Inject DateUtil dateUtil;

public ThemeState currentThemeState;

private TextSecurePreferences getPreferences() {
Original file line number Diff line number Diff line change
@@ -77,7 +77,6 @@
import org.thoughtcrime.securesms.mms.Slide;
import org.thoughtcrime.securesms.permissions.Permissions;
import org.thoughtcrime.securesms.util.AttachmentUtil;
import org.thoughtcrime.securesms.util.DateUtils;
import org.thoughtcrime.securesms.util.SaveAttachmentTask;
import org.thoughtcrime.securesms.util.SaveAttachmentTask.Attachment;

@@ -243,7 +242,7 @@ private void updateActionBar() {
CharSequence relativeTimeSpan;

if (mediaItem.date > 0) {
relativeTimeSpan = DateUtils.getDisplayFormattedTimeSpanString(this, Locale.getDefault(), mediaItem.date);
relativeTimeSpan = dateUtil.getDisplayFormattedTimeSpanString(mediaItem.date);
} else {
relativeTimeSpan = getString(R.string.MediaPreviewActivity_draft);
}
Original file line number Diff line number Diff line change
@@ -153,6 +153,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
@Inject lateinit var storage: Storage
@Inject lateinit var reactionDb: ReactionDatabase
@Inject lateinit var viewModelFactory: ConversationViewModel.AssistedFactory
@Inject lateinit var dateUtil: DateUtil

private val screenshotObserver by lazy {
ScreenshotObserver(this, Handler(Looper.getMainLooper())) {
@@ -1727,7 +1728,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
val body = MentionUtilities.highlightMentions(message.body, viewModel.threadId, this)
if (TextUtils.isEmpty(body)) { continue }
if (messageSize > 1) {
val formattedTimestamp = DateUtils.getDisplayFormattedTimeSpanString(this, Locale.getDefault(), message.timestamp)
val formattedTimestamp = dateUtil.getDisplayFormattedTimeSpanString(message.timestamp)
builder.append("$formattedTimestamp: ")
}
builder.append(body)
Original file line number Diff line number Diff line change
@@ -43,18 +43,21 @@
import org.thoughtcrime.securesms.database.model.ReactionRecord;
import org.thoughtcrime.securesms.dependencies.DatabaseComponent;
import org.thoughtcrime.securesms.util.AnimationCompleteListener;
import org.thoughtcrime.securesms.util.DateUtils;
import org.thoughtcrime.securesms.util.DateUtil;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;

import javax.inject.Inject;

import dagger.hilt.android.AndroidEntryPoint;
import kotlin.Unit;
import network.loki.messenger.R;

@AndroidEntryPoint
public final class ConversationReactionOverlay extends FrameLayout {

@Inject DateUtil dateUtil;
public static final float LONG_PRESS_SCALE_FACTOR = 0.95f;
private static final Interpolator INTERPOLATOR = new DecelerateInterpolator();

@@ -169,7 +172,7 @@ public void show(@NonNull Activity activity,
conversationBubble.setLayoutParams(new LinearLayout.LayoutParams(conversationItemSnapshot.getWidth(), conversationItemSnapshot.getHeight()));
conversationBubble.setBackground(new BitmapDrawable(getResources(), conversationItemSnapshot));
TextView conversationTimestamp = conversationItem.findViewById(R.id.conversation_item_timestamp);
conversationTimestamp.setText(DateUtils.getDisplayFormattedTimeSpanString(getContext(), Locale.getDefault(), messageRecord.getTimestamp()));
conversationTimestamp.setText(dateUtil.getDisplayFormattedTimeSpanString(messageRecord.getTimestamp()));

updateConversationTimestamp(messageRecord);

Original file line number Diff line number Diff line change
@@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.conversation.v2.messages
import android.widget.TextView
import androidx.core.view.isVisible
import org.thoughtcrime.securesms.database.model.MessageRecord
import org.thoughtcrime.securesms.util.DateUtil
import org.thoughtcrime.securesms.util.DateUtils
import java.util.Locale

@@ -11,5 +12,5 @@ private const val maxTimeBetweenBreaks = 5 * 60 * 1000L // 5 minutes
fun TextView.showDateBreak(message: MessageRecord, previous: MessageRecord?) {
val showDateBreak = (previous == null || message.timestamp - previous.timestamp > maxTimeBetweenBreaks)
isVisible = showDateBreak
text = if (showDateBreak) DateUtils.getDisplayFormattedTimeSpanString(context, Locale.getDefault(), message.timestamp) else ""
text = if (showDateBreak) DateUtil(context).getDisplayFormattedTimeSpanString(message.timestamp) else ""
}
Original file line number Diff line number Diff line change
@@ -47,10 +47,7 @@ import org.thoughtcrime.securesms.database.model.MessageRecord
import org.thoughtcrime.securesms.groups.OpenGroupManager
import org.thoughtcrime.securesms.home.UserDetailsBottomSheet
import org.thoughtcrime.securesms.mms.GlideRequests
import org.thoughtcrime.securesms.util.DateUtils
import org.thoughtcrime.securesms.util.disableClipping
import org.thoughtcrime.securesms.util.toDp
import org.thoughtcrime.securesms.util.toPx
import org.thoughtcrime.securesms.util.*
import java.util.Date
import java.util.Locale
import javax.inject.Inject
@@ -62,6 +59,7 @@ import kotlin.math.sqrt
@AndroidEntryPoint
class VisibleMessageView : LinearLayout {

@Inject lateinit var dateUtil: DateUtil
@Inject lateinit var threadDb: ThreadDatabase
@Inject lateinit var lokiThreadDb: LokiThreadDatabase
@Inject lateinit var lokiApiDb: LokiAPIDatabase
@@ -193,7 +191,7 @@ class VisibleMessageView : LinearLayout {
binding.senderNameTextView.text = contact?.displayName(contactContext) ?: senderSessionID
// Date break
val showDateBreak = isStartOfMessageCluster || snIsSelected
binding.dateBreakTextView.text = if (showDateBreak) DateUtils.getDisplayFormattedTimeSpanString(context, Locale.getDefault(), message.timestamp) else null
binding.dateBreakTextView.text = if (showDateBreak) dateUtil.getDisplayFormattedTimeSpanString(message.timestamp) else null
binding.dateBreakTextView.isVisible = showDateBreak
// Message status indicator
if (message.isOutgoing) {
Original file line number Diff line number Diff line change
@@ -20,11 +20,15 @@ import org.thoughtcrime.securesms.database.RecipientDatabase.NOTIFY_TYPE_ALL
import org.thoughtcrime.securesms.database.RecipientDatabase.NOTIFY_TYPE_NONE
import org.thoughtcrime.securesms.database.model.ThreadRecord
import org.thoughtcrime.securesms.mms.GlideRequests
import org.thoughtcrime.securesms.util.DateUtil
import org.thoughtcrime.securesms.util.DateUtils
import org.thoughtcrime.securesms.util.getAccentColor
import java.util.Locale
import javax.inject.Inject

class ConversationView : LinearLayout {
@Inject lateinit var dateUtil: DateUtil

private val binding: ViewConversationBinding by lazy { ViewConversationBinding.bind(this) }
private val screenWidth = Resources.getSystem().displayMetrics.widthPixels
var thread: ThreadRecord? = null
@@ -85,7 +89,7 @@ class ConversationView : LinearLayout {
val senderDisplayName = getUserDisplayName(thread.recipient)
?: thread.recipient.address.toString()
binding.conversationViewDisplayNameTextView.text = senderDisplayName
binding.timestampTextView.text = DateUtils.getDisplayFormattedTimeSpanString(context, Locale.getDefault(), thread.date)
binding.timestampTextView.text = dateUtil.getDisplayFormattedTimeSpanString(thread.date)
val recipient = thread.recipient
binding.muteIndicatorImageView.isVisible = recipient.isMuted || recipient.notifyType != NOTIFY_TYPE_ALL
val drawableRes = if (recipient.isMuted || recipient.notifyType == NOTIFY_TYPE_NONE) {
15 changes: 3 additions & 12 deletions app/src/main/java/org/thoughtcrime/securesms/home/HomeActivity.kt
Original file line number Diff line number Diff line change
@@ -63,13 +63,7 @@ import org.thoughtcrime.securesms.mms.GlideRequests
import org.thoughtcrime.securesms.onboarding.SeedActivity
import org.thoughtcrime.securesms.onboarding.SeedReminderViewDelegate
import org.thoughtcrime.securesms.preferences.SettingsActivity
import org.thoughtcrime.securesms.util.ConfigurationMessageUtilities
import org.thoughtcrime.securesms.util.DateUtils
import org.thoughtcrime.securesms.util.IP2Country
import org.thoughtcrime.securesms.util.disableClipping
import org.thoughtcrime.securesms.util.push
import org.thoughtcrime.securesms.util.show
import org.thoughtcrime.securesms.util.themeState
import org.thoughtcrime.securesms.util.*
import java.io.IOException
import java.util.Locale
import javax.inject.Inject
@@ -84,6 +78,7 @@ class HomeActivity : PassphraseRequiredActionBarActivity(),
private lateinit var glide: GlideRequests
private var broadcastReceiver: BroadcastReceiver? = null

@Inject lateinit var dateUtil: DateUtil
@Inject lateinit var threadDb: ThreadDatabase
@Inject lateinit var mmsSmsDatabase: MmsSmsDatabase
@Inject lateinit var recipientDatabase: RecipientDatabase
@@ -290,11 +285,7 @@ class HomeActivity : PassphraseRequiredActionBarActivity(),
if (messageRequestCount > 0 && !textSecurePreferences.hasHiddenMessageRequests()) {
with(ViewMessageRequestBannerBinding.inflate(layoutInflater)) {
unreadCountTextView.text = messageRequestCount.toString()
timestampTextView.text = DateUtils.getDisplayFormattedTimeSpanString(
this@HomeActivity,
Locale.getDefault(),
threadDb.latestUnapprovedConversationTimestamp
)
timestampTextView.text = dateUtil.getDisplayFormattedTimeSpanString(threadDb.latestUnapprovedConversationTimestamp)
root.setOnClickListener { showMessageRequests() }
root.setOnLongClickListener { hideMessageRequests(); true }
root.layoutParams = RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.WRAP_CONTENT)
Original file line number Diff line number Diff line change
@@ -14,6 +14,7 @@ import org.thoughtcrime.securesms.home.search.GlobalSearchAdapter.ContentView
import org.thoughtcrime.securesms.home.search.GlobalSearchAdapter.Model.GroupConversation
import org.thoughtcrime.securesms.home.search.GlobalSearchAdapter.Model.Message
import org.thoughtcrime.securesms.home.search.GlobalSearchAdapter.Model.SavedMessages
import org.thoughtcrime.securesms.util.DateUtil
import org.thoughtcrime.securesms.util.DateUtils
import org.thoughtcrime.securesms.util.SearchUtil
import java.util.Locale
@@ -134,7 +135,7 @@ fun ContentView.bindModel(query: String?, model: Message) {
// if (hasUnreads) {
// binding.unreadCountTextView.text = model.unread.toString()
// }
binding.searchResultTimestamp.text = DateUtils.getDisplayFormattedTimeSpanString(binding.root.context, Locale.getDefault(), model.messageResult.sentTimestampMs)
binding.searchResultTimestamp.text = DateUtil(binding.root.context).getDisplayFormattedTimeSpanString(model.messageResult.sentTimestampMs)
binding.searchResultProfilePicture.root.update(model.messageResult.conversationRecipient)
val textSpannable = SpannableStringBuilder()
if (model.messageResult.conversationRecipient != model.messageResult.messageRecipient) {
Original file line number Diff line number Diff line change
@@ -6,16 +6,21 @@ import android.util.AttributeSet
import android.view.LayoutInflater
import android.widget.LinearLayout
import androidx.recyclerview.widget.RecyclerView
import dagger.hilt.android.AndroidEntryPoint
import network.loki.messenger.R
import network.loki.messenger.databinding.ViewMessageRequestBinding
import org.session.libsession.utilities.recipients.Recipient
import org.thoughtcrime.securesms.conversation.v2.utilities.MentionUtilities.highlightMentions
import org.thoughtcrime.securesms.database.model.ThreadRecord
import org.thoughtcrime.securesms.mms.GlideRequests
import org.thoughtcrime.securesms.util.DateUtil
import org.thoughtcrime.securesms.util.DateUtils
import java.util.Locale

@AndroidEntryPoint
class MessageRequestView : LinearLayout {
lateinit var dateUtil: DateUtil

private lateinit var binding: ViewMessageRequestBinding
private val screenWidth = Resources.getSystem().displayMetrics.widthPixels
var thread: ThreadRecord? = null
@@ -38,7 +43,7 @@ class MessageRequestView : LinearLayout {
val senderDisplayName = getUserDisplayName(thread.recipient)
?: thread.recipient.address.toString()
binding.displayNameTextView.text = senderDisplayName
binding.timestampTextView.text = DateUtils.getDisplayFormattedTimeSpanString(context, Locale.getDefault(), thread.date)
binding.timestampTextView.text = dateUtil.getDisplayFormattedTimeSpanString(thread.date)
val rawSnippet = thread.getDisplayBody(context)
val snippet = highlightMentions(rawSnippet, thread.threadId, context)
binding.snippetTextView.text = snippet
Original file line number Diff line number Diff line change
@@ -73,15 +73,6 @@ object BackupUtil {
return prefList
}

@JvmStatic
fun getLastBackupTimeString(context: Context, locale: Locale): String {
val timestamp = DatabaseComponent.get(context).lokiBackupFilesDatabase().getLastBackupFileTime()
if (timestamp == null) {
return context.getString(R.string.BackupUtil_never)
}
return DateUtils.getDisplayFormattedTimeSpanString(context, locale, timestamp.time)
}

@JvmStatic
fun getLastBackup(context: Context): BackupFileRecord? {
return DatabaseComponent.get(context).lokiBackupFilesDatabase().getLastBackupFile()
10 changes: 10 additions & 0 deletions app/src/main/java/org/thoughtcrime/securesms/util/Clock.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package org.thoughtcrime.securesms.util

interface Clock {
val currentTimeMillis: Long
}

object AndroidClock: Clock {
override val currentTimeMillis: Long
get() = System.currentTimeMillis()
}
52 changes: 52 additions & 0 deletions app/src/main/java/org/thoughtcrime/securesms/util/DateUtil.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package org.thoughtcrime.securesms.util

import android.content.Context
import dagger.hilt.android.qualifiers.ApplicationContext
import network.loki.messenger.R
import org.thoughtcrime.securesms.util.DateUtils.isSameDay
import java.util.*
import java.util.concurrent.TimeUnit
import javax.inject.Inject

class DateUtil (
private val context: Context,
private val clock: Clock
) {
@Inject constructor(@ApplicationContext context: Context): this(context, AndroidClock)

/**
* If the message was sent/received on the same day we show: 12 hour time + am/pm
* 12:43 pm
* If the message was sent/received on the same week we show: word abbreviation day of week + 12 hour time + am/pm
* Tue 12:34 pm
* If the message was sent/received in the current year we show, word abbreviation of month, date (day) and 12 hour time + am/pm
* Mar 9 12:34 pm
* If the message was sent or received outside of the current year, then we show dd/mm/yy
* 09/03/23
*/
@JvmOverloads
fun getDisplayFormattedTimeSpanString(timestamp: Long, locale: Locale = Locale.getDefault()): String {
if (isWithin(timestamp, 1, TimeUnit.MINUTES)) {
return context.getString(R.string.DateUtils_just_now)
}
return when {
isToday(timestamp) -> context.hourFormat
isWithin(timestamp, 6, TimeUnit.DAYS) -> "EEE " + context.hourFormat
isThisYear(timestamp) -> "MMM d " + context.hourFormat
else -> "MMM d " + context.hourFormat + ", yyyy"
}.let { DateUtils.getFormattedDateTime(timestamp, it, locale) }
}

private fun isThisYear(millis: Long): Boolean = isSameYear(millis, clock.currentTimeMillis)

fun isToday(time: Long): Boolean = isSameDay(time, clock.currentTimeMillis)

fun isWithin(millis: Long, span: Long, unit: TimeUnit): Boolean =
clock.currentTimeMillis - millis <= unit.toMillis(span)
}

fun isSameYear(millis: Long, millisOther: Long): Boolean = Calendar.getInstance().run {
apply { timeInMillis = millis }.get(Calendar.YEAR) == apply { timeInMillis = millisOther }.get(Calendar.YEAR)
}

private val Context.hourFormat: String get() = DateUtils.getHourFormat(this)
16 changes: 1 addition & 15 deletions app/src/main/java/org/thoughtcrime/securesms/util/DateUtils.java
Original file line number Diff line number Diff line change
@@ -45,7 +45,7 @@ public class DateUtils extends android.text.format.DateUtils {
private static final SimpleDateFormat DAY_PRECISION_DATE_FORMAT = new SimpleDateFormat("yyyyMMdd");
private static final SimpleDateFormat HOUR_PRECISION_DATE_FORMAT = new SimpleDateFormat("yyyyMMddHH");

private static boolean isWithin(final long millis, final long span, final TimeUnit unit) {
static boolean isWithin(final long millis, final long span, final TimeUnit unit) {
return System.currentTimeMillis() - millis <= unit.toMillis(span);
}

@@ -66,20 +66,6 @@ public static String getHourFormat(Context c) {
return (DateFormat.is24HourFormat(c)) ? "HH:mm" : "hh:mm a";
}

public static String getDisplayFormattedTimeSpanString(final Context c, final Locale locale, final long timestamp) {
if (isWithin(timestamp, 1, TimeUnit.MINUTES)) {
return c.getString(R.string.DateUtils_just_now);
} else if (isToday(timestamp)) {
return getFormattedDateTime(timestamp, getHourFormat(c), locale);
} else if (isWithin(timestamp, 6, TimeUnit.DAYS)) {
return getFormattedDateTime(timestamp, "EEE " + getHourFormat(c), locale);
} else if (isWithin(timestamp, 365, TimeUnit.DAYS)) {
return getFormattedDateTime(timestamp, "MMM d " + getHourFormat(c), locale);
} else {
return getFormattedDateTime(timestamp, "MMM d " + getHourFormat(c) + ", yyyy", locale);
}
}

public static SimpleDateFormat getDetailedDateFormatter(Context context, Locale locale) {
String dateFormatPattern;

Loading