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 im.vector.matrix.android.api.Matrix
import im.vector.matrix.android.api.MatrixOptions
import im.vector.riotredesign.core.resources.LocaleProvider
import org.koin.dsl.context.ModuleDefinition
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)
}
single {
LocaleProvider(context.resources)
}
}.invoke()
}

View File

@ -3,10 +3,10 @@ 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
import org.threeten.bp.ZoneId
fun Event.localDateTime(): LocalDateTime {
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
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.module.Module
import org.koin.dsl.module.module
@ -12,5 +14,13 @@ class HomeModule(private val homeActivity: HomeActivity) : Module {
homeActivity as HomeNavigator
}
factory {
TimelineDateFormatter(get())
}
factory {
TimelineEventController(get())
}
}.invoke()
}

View File

@ -34,8 +34,7 @@ class RoomDetailFragment : RiotFragment() {
private val matrix by inject<Matrix>()
private val currentSession = matrix.currentSession
private var roomId by FragmentArgumentDelegate<String>()
private lateinit var timelineEventController: TimelineEventController
private val timelineEventController by inject<TimelineEventController>()
private lateinit var room: Room
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 listUpdateCallback = ScrollOnNewMessageCallback(layoutManager)
recyclerView.layoutManager = layoutManager
timelineEventController = TimelineEventController(riotActivity)
timelineEventController.addModelBuildListener { it.dispatchTo(listUpdateCallback) }
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
import android.arch.paging.PagedList
import android.content.Context
import com.airbnb.epoxy.EpoxyAsyncUtil
import com.airbnb.epoxy.EpoxyController
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.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(
class TimelineEventController(private val timelineDateFormatter: TimelineDateFormatter) : EpoxyController(
EpoxyAsyncUtil.getAsyncBackgroundHandler(),
EpoxyAsyncUtil.getAsyncBackgroundHandler()
) {
@ -74,7 +71,7 @@ class TimelineEventController(private val context: Context) : EpoxyController(
message = messageContent.body,
avatarUrl = roomMember.avatarUrl,
showInformation = showInformation,
time = date.toLocalTime().format(DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT)),
time = timelineDateFormatter.formatMessageHour(date),
memberName = roomMember.displayName
)
.onBind { timeline?.loadAround(index) }
@ -87,7 +84,7 @@ class TimelineEventController(private val context: Context) : EpoxyController(
.addTo(this)
}
if (addDaySeparator) {
val formattedDay = date.toLocalDate().format(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM))
val formattedDay = timelineDateFormatter.formatMessageDay(date)
TimelineDaySeparatorItem(formattedDay).id(formattedDay).addTo(this)
}
}

View File

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

View File

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