From 900217b90e88bfa17b72479d070d5c4092731dbf Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 31 Oct 2018 16:11:59 +0100 Subject: [PATCH] Timeline : quickly manage dates (need to be clean) --- .idea/caches/build_file_checksums.ser | Bin 659 -> 659 bytes app/build.gradle | 2 + .../main/java/im/vector/riotredesign/Riot.kt | 2 + .../riotredesign/core/extensions/Event.kt | 12 +++++ .../room/detail/TimelineDaySeparatorItem.kt | 16 ++++++ .../room/detail/TimelineEventController.kt | 23 +++++++-- .../res/layout/item_event_day_separator.xml | 46 +++++++++++++++++- 7 files changed, 95 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/im/vector/riotredesign/core/extensions/Event.kt create mode 100644 app/src/main/java/im/vector/riotredesign/features/home/room/detail/TimelineDaySeparatorItem.kt diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index 27ab41a0cfd8f56b925fa5621d37b8ec23babaef..3e19f42d04803496c8c732f7c0c89f9bdf2e9380 100644 GIT binary patch delta 33 rcmV++0N($T1(OAkm;}m*+|{w1<^d6IB++TH4=dB?6J~q3?D1fD31Sd< delta 33 rcmV++0N($T1(OAkm;}X%yr;38<^d7$zkUv7f=?ElzEqAuG9|ir0m=^H diff --git a/app/build.gradle b/app/build.gradle index 1d462efa71..3481c69425 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,6 +47,8 @@ dependencies { implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' + implementation 'com.jakewharton.threetenabp:threetenabp:1.1.1' + implementation 'com.jakewharton.timber:timber:4.7.1' implementation("com.airbnb.android:epoxy:$epoxy_version") diff --git a/app/src/main/java/im/vector/riotredesign/Riot.kt b/app/src/main/java/im/vector/riotredesign/Riot.kt index c83d0da725..d7d7e8beeb 100644 --- a/app/src/main/java/im/vector/riotredesign/Riot.kt +++ b/app/src/main/java/im/vector/riotredesign/Riot.kt @@ -1,6 +1,7 @@ package im.vector.riotredesign import android.app.Application +import com.jakewharton.threetenabp.AndroidThreeTen import im.vector.matrix.android.BuildConfig import im.vector.riotredesign.core.di.AppModule import org.koin.log.EmptyLogger @@ -14,6 +15,7 @@ class Riot : Application() { if (BuildConfig.DEBUG) { Timber.plant(Timber.DebugTree()) } + AndroidThreeTen.init(this) startKoin(listOf(AppModule(this)), logger = EmptyLogger()) } diff --git a/app/src/main/java/im/vector/riotredesign/core/extensions/Event.kt b/app/src/main/java/im/vector/riotredesign/core/extensions/Event.kt new file mode 100644 index 0000000000..9b7aa263d5 --- /dev/null +++ b/app/src/main/java/im/vector/riotredesign/core/extensions/Event.kt @@ -0,0 +1,12 @@ +package im.vector.riotredesign.core.extensions + +import im.vector.matrix.android.api.session.events.model.Event +import org.threeten.bp.Instant +import org.threeten.bp.LocalDateTime +import org.threeten.bp.ZoneOffset + + +fun Event.localDateTime(): LocalDateTime { + val instant = Instant.ofEpochMilli(originServerTs ?: 0) + return LocalDateTime.ofInstant(instant, ZoneOffset.UTC) +} \ No newline at end of file diff --git a/app/src/main/java/im/vector/riotredesign/features/home/room/detail/TimelineDaySeparatorItem.kt b/app/src/main/java/im/vector/riotredesign/features/home/room/detail/TimelineDaySeparatorItem.kt new file mode 100644 index 0000000000..83d8e03544 --- /dev/null +++ b/app/src/main/java/im/vector/riotredesign/features/home/room/detail/TimelineDaySeparatorItem.kt @@ -0,0 +1,16 @@ +package im.vector.riotredesign.features.home.room.detail + +import android.widget.TextView +import im.vector.riotredesign.R +import im.vector.riotredesign.core.epoxy.KotlinModel + +data class TimelineDaySeparatorItem( + val formattedDay: CharSequence +) : KotlinModel(R.layout.item_event_day_separator) { + + private val dayTextView by bind(R.id.itemDayTextView) + + override fun bind() { + dayTextView.text = formattedDay + } +} \ No newline at end of file diff --git a/app/src/main/java/im/vector/riotredesign/features/home/room/detail/TimelineEventController.kt b/app/src/main/java/im/vector/riotredesign/features/home/room/detail/TimelineEventController.kt index 1d4f024042..0d3018f69a 100644 --- a/app/src/main/java/im/vector/riotredesign/features/home/room/detail/TimelineEventController.kt +++ b/app/src/main/java/im/vector/riotredesign/features/home/room/detail/TimelineEventController.kt @@ -9,14 +9,17 @@ import im.vector.matrix.android.api.session.events.model.EventType import im.vector.matrix.android.api.session.events.model.roomMember import im.vector.matrix.android.api.session.room.model.MessageContent import im.vector.riotredesign.core.extensions.avatarDrawable +import im.vector.riotredesign.core.extensions.localDateTime import im.vector.riotredesign.features.home.LoadingItemModel_ +import org.threeten.bp.format.DateTimeFormatter +import org.threeten.bp.format.FormatStyle class TimelineEventController(private val context: Context) : EpoxyController( EpoxyAsyncUtil.getAsyncBackgroundHandler(), EpoxyAsyncUtil.getAsyncBackgroundHandler() ) { - private val messagesLoadedWithInformation = HashSet() + private val messagesDisplayedWithInformation = HashSet() private val pagedListCallback = object : PagedList.Callback() { override fun onChanged(position: Int, count: Int) { @@ -57,22 +60,34 @@ class TimelineEventController(private val context: Context) : EpoxyController( if (messageContent == null || roomMember == null) { continue } + + val date = event.root.localDateTime() + val nextDate = nextEvent?.root?.localDateTime() + val addDaySeparator = date.toLocalDate() != nextDate?.toLocalDate() + val nextRoomMember = nextEvent?.roomMember() - if (nextRoomMember != roomMember) { - messagesLoadedWithInformation.add(event.root.eventId) + if (addDaySeparator || nextRoomMember != roomMember) { + messagesDisplayedWithInformation.add(event.root.eventId) } - val showInformation = messagesLoadedWithInformation.contains(event.root.eventId) + val showInformation = messagesDisplayedWithInformation.contains(event.root.eventId) val avatarDrawable = context.avatarDrawable(roomMember.displayName ?: "") TimelineMessageItem( message = messageContent.body, showInformation = showInformation, + time = date.toLocalTime().format(DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT)), avatarDrawable = avatarDrawable, memberName = roomMember.displayName ) .onBind { timeline?.loadAround(index) } .id(event.root.eventId) .addTo(this) + + + if (addDaySeparator) { + val formattedDay = date.toLocalDate().format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM)) + TimelineDaySeparatorItem(formattedDay).id(formattedDay).addTo(this) + } } } diff --git a/app/src/main/res/layout/item_event_day_separator.xml b/app/src/main/res/layout/item_event_day_separator.xml index a481e9be16..124bee5b40 100644 --- a/app/src/main/res/layout/item_event_day_separator.xml +++ b/app/src/main/res/layout/item_event_day_separator.xml @@ -1,10 +1,52 @@ + android:padding="8dp"> + + + + + + \ No newline at end of file