Better date management

This commit is contained in:
ganfra 2018-11-02 11:50:56 +01:00
parent 891d7b3323
commit 9c48eba26c
9 changed files with 62 additions and 13 deletions

View File

@ -3,6 +3,7 @@ package im.vector.riotredesign.core.di
import android.content.Context import android.content.Context
import im.vector.matrix.android.api.Matrix import im.vector.matrix.android.api.Matrix
import im.vector.matrix.android.api.MatrixOptions import im.vector.matrix.android.api.MatrixOptions
import im.vector.riotredesign.core.resources.LocaleProvider
import org.koin.dsl.context.ModuleDefinition import org.koin.dsl.context.ModuleDefinition
import org.koin.dsl.module.Module import org.koin.dsl.module.Module
import org.koin.dsl.module.module import org.koin.dsl.module.module
@ -16,5 +17,9 @@ class AppModule(private val context: Context) : Module {
Matrix(matrixOptions) Matrix(matrixOptions)
} }
single {
LocaleProvider(context.resources)
}
}.invoke() }.invoke()
} }

View File

@ -3,10 +3,10 @@ package im.vector.riotredesign.core.extensions
import im.vector.matrix.android.api.session.events.model.Event import im.vector.matrix.android.api.session.events.model.Event
import org.threeten.bp.Instant import org.threeten.bp.Instant
import org.threeten.bp.LocalDateTime import org.threeten.bp.LocalDateTime
import org.threeten.bp.ZoneOffset import org.threeten.bp.ZoneId
fun Event.localDateTime(): LocalDateTime { fun Event.localDateTime(): LocalDateTime {
val instant = Instant.ofEpochMilli(originServerTs ?: 0) val instant = Instant.ofEpochMilli(originServerTs ?: 0)
return LocalDateTime.ofInstant(instant, ZoneOffset.UTC) return LocalDateTime.ofInstant(instant, ZoneId.systemDefault())
} }

View File

@ -0,0 +1,14 @@
package im.vector.riotredesign.core.resources
import android.content.res.Resources
import android.support.v4.os.ConfigurationCompat
import java.util.*
class LocaleProvider(private val resources: Resources) {
fun current(): Locale {
return ConfigurationCompat.getLocales(resources.configuration)[0]
}
}

View File

@ -1,5 +1,7 @@
package im.vector.riotredesign.features.home package im.vector.riotredesign.features.home
import im.vector.riotredesign.features.home.room.detail.timeline.TimelineDateFormatter
import im.vector.riotredesign.features.home.room.detail.timeline.TimelineEventController
import org.koin.dsl.context.ModuleDefinition import org.koin.dsl.context.ModuleDefinition
import org.koin.dsl.module.Module import org.koin.dsl.module.Module
import org.koin.dsl.module.module import org.koin.dsl.module.module
@ -12,5 +14,13 @@ class HomeModule(private val homeActivity: HomeActivity) : Module {
homeActivity as HomeNavigator homeActivity as HomeNavigator
} }
factory {
TimelineDateFormatter(get())
}
factory {
TimelineEventController(get())
}
}.invoke() }.invoke()
} }

View File

@ -34,8 +34,7 @@ class RoomDetailFragment : RiotFragment() {
private val matrix by inject<Matrix>() private val matrix by inject<Matrix>()
private val currentSession = matrix.currentSession private val currentSession = matrix.currentSession
private var roomId by FragmentArgumentDelegate<String>() private var roomId by FragmentArgumentDelegate<String>()
private val timelineEventController by inject<TimelineEventController>()
private lateinit var timelineEventController: TimelineEventController
private lateinit var room: Room private lateinit var room: Room
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
@ -63,7 +62,6 @@ class RoomDetailFragment : RiotFragment() {
val layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, true) val layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, true)
val listUpdateCallback = ScrollOnNewMessageCallback(layoutManager) val listUpdateCallback = ScrollOnNewMessageCallback(layoutManager)
recyclerView.layoutManager = layoutManager recyclerView.layoutManager = layoutManager
timelineEventController = TimelineEventController(riotActivity)
timelineEventController.addModelBuildListener { it.dispatchTo(listUpdateCallback) } timelineEventController.addModelBuildListener { it.dispatchTo(listUpdateCallback) }
recyclerView.setController(timelineEventController) recyclerView.setController(timelineEventController)
} }

View File

@ -0,0 +1,17 @@
package im.vector.riotredesign.features.home.room.detail.timeline
import im.vector.riotredesign.core.resources.LocaleProvider
import org.threeten.bp.LocalDateTime
import org.threeten.bp.format.DateTimeFormatter
class TimelineDateFormatter(private val localeProvider: LocaleProvider) {
fun formatMessageHour(localDateTime: LocalDateTime): String {
return DateTimeFormatter.ofPattern("H:mm", localeProvider.current()).format(localDateTime)
}
fun formatMessageDay(localDateTime: LocalDateTime): String {
return DateTimeFormatter.ofPattern("EEE d MMM", localeProvider.current()).format(localDateTime)
}
}

View File

@ -1,7 +1,6 @@
package im.vector.riotredesign.features.home.room.detail.timeline package im.vector.riotredesign.features.home.room.detail.timeline
import android.arch.paging.PagedList import android.arch.paging.PagedList
import android.content.Context
import com.airbnb.epoxy.EpoxyAsyncUtil import com.airbnb.epoxy.EpoxyAsyncUtil
import com.airbnb.epoxy.EpoxyController import com.airbnb.epoxy.EpoxyController
import im.vector.matrix.android.api.session.events.model.EnrichedEvent import im.vector.matrix.android.api.session.events.model.EnrichedEvent
@ -10,10 +9,8 @@ import im.vector.matrix.android.api.session.events.model.roomMember
import im.vector.matrix.android.api.session.room.model.MessageContent import im.vector.matrix.android.api.session.room.model.MessageContent
import im.vector.riotredesign.core.extensions.localDateTime import im.vector.riotredesign.core.extensions.localDateTime
import im.vector.riotredesign.features.home.LoadingItemModel_ 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( class TimelineEventController(private val timelineDateFormatter: TimelineDateFormatter) : EpoxyController(
EpoxyAsyncUtil.getAsyncBackgroundHandler(), EpoxyAsyncUtil.getAsyncBackgroundHandler(),
EpoxyAsyncUtil.getAsyncBackgroundHandler() EpoxyAsyncUtil.getAsyncBackgroundHandler()
) { ) {
@ -74,7 +71,7 @@ class TimelineEventController(private val context: Context) : EpoxyController(
message = messageContent.body, message = messageContent.body,
avatarUrl = roomMember.avatarUrl, avatarUrl = roomMember.avatarUrl,
showInformation = showInformation, showInformation = showInformation,
time = date.toLocalTime().format(DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT)), time = timelineDateFormatter.formatMessageHour(date),
memberName = roomMember.displayName memberName = roomMember.displayName
) )
.onBind { timeline?.loadAround(index) } .onBind { timeline?.loadAround(index) }
@ -87,7 +84,7 @@ class TimelineEventController(private val context: Context) : EpoxyController(
.addTo(this) .addTo(this)
} }
if (addDaySeparator) { if (addDaySeparator) {
val formattedDay = date.toLocalDate().format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM)) val formattedDay = timelineDateFormatter.formatMessageDay(date)
TimelineDaySeparatorItem(formattedDay).id(formattedDay).addTo(this) TimelineDaySeparatorItem(formattedDay).id(formattedDay).addTo(this)
} }
} }

View File

@ -23,11 +23,14 @@ class Matrix(matrixOptions: MatrixOptions) : KoinComponent {
init { init {
Monarchy.init(matrixOptions.context) Monarchy.init(matrixOptions.context)
val matrixModule = MatrixModule(matrixOptions) val matrixModule = MatrixModule(matrixOptions)
val networkModule = NetworkModule() val networkModule = NetworkModule()
val authModule = AuthModule() val authModule = AuthModule()
loadKoinModules(listOf(matrixModule, networkModule, authModule)) loadKoinModules(listOf(matrixModule, networkModule, authModule))
ProcessLifecycleOwner.get().lifecycle.addObserver(backgroundDetectionObserver) ProcessLifecycleOwner.get().lifecycle.addObserver(backgroundDetectionObserver)
val lastActiveSession = authenticator.getLastActiveSession() val lastActiveSession = authenticator.getLastActiveSession()
if (lastActiveSession != null) { if (lastActiveSession != null) {
currentSession = lastActiveSession currentSession = lastActiveSession

View File

@ -19,11 +19,16 @@ class SessionModule(private val sessionParams: SessionParams) : Module {
override fun invoke(): ModuleDefinition = module(override = true) { override fun invoke(): ModuleDefinition = module(override = true) {
scope(DefaultSession.SCOPE) { scope(DefaultSession.SCOPE) {
RealmConfiguration.Builder().name(sessionParams.credentials.userId).deleteRealmIfMigrationNeeded().build() RealmConfiguration.Builder()
.name(sessionParams.credentials.userId)
.deleteRealmIfMigrationNeeded()
.build()
} }
scope(DefaultSession.SCOPE) { scope(DefaultSession.SCOPE) {
Monarchy.Builder().setRealmConfiguration(get()).build() Monarchy.Builder()
.setRealmConfiguration(get())
.build()
} }
scope(DefaultSession.SCOPE) { scope(DefaultSession.SCOPE) {