From 9c48eba26c273d91e92b434e60e40bd09e7780c1 Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 2 Nov 2018 11:50:56 +0100 Subject: [PATCH] Better date management --- .../im/vector/riotredesign/core/di/AppModule.kt | 5 +++++ .../riotredesign/core/extensions/Event.kt | 4 ++-- .../core/resources/LocaleProvider.kt | 14 ++++++++++++++ .../riotredesign/features/home/HomeModule.kt | 10 ++++++++++ .../home/room/detail/RoomDetailFragment.kt | 4 +--- .../detail/timeline/TimelineDateFormatter.kt | 17 +++++++++++++++++ .../detail/timeline/TimelineEventController.kt | 9 +++------ .../java/im/vector/matrix/android/api/Matrix.kt | 3 +++ .../android/internal/session/SessionModule.kt | 9 +++++++-- 9 files changed, 62 insertions(+), 13 deletions(-) create mode 100644 app/src/main/java/im/vector/riotredesign/core/resources/LocaleProvider.kt create mode 100644 app/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/TimelineDateFormatter.kt diff --git a/app/src/main/java/im/vector/riotredesign/core/di/AppModule.kt b/app/src/main/java/im/vector/riotredesign/core/di/AppModule.kt index e06c3daebd..ddfbaea4d1 100644 --- a/app/src/main/java/im/vector/riotredesign/core/di/AppModule.kt +++ b/app/src/main/java/im/vector/riotredesign/core/di/AppModule.kt @@ -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() } \ No newline at end of file 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 index 9b7aa263d5..f90b16bee1 100644 --- a/app/src/main/java/im/vector/riotredesign/core/extensions/Event.kt +++ b/app/src/main/java/im/vector/riotredesign/core/extensions/Event.kt @@ -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()) } \ No newline at end of file diff --git a/app/src/main/java/im/vector/riotredesign/core/resources/LocaleProvider.kt b/app/src/main/java/im/vector/riotredesign/core/resources/LocaleProvider.kt new file mode 100644 index 0000000000..c8a3aabc00 --- /dev/null +++ b/app/src/main/java/im/vector/riotredesign/core/resources/LocaleProvider.kt @@ -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] + } + + +} \ No newline at end of file diff --git a/app/src/main/java/im/vector/riotredesign/features/home/HomeModule.kt b/app/src/main/java/im/vector/riotredesign/features/home/HomeModule.kt index 0c8cf539b2..d87f6bff8a 100644 --- a/app/src/main/java/im/vector/riotredesign/features/home/HomeModule.kt +++ b/app/src/main/java/im/vector/riotredesign/features/home/HomeModule.kt @@ -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() } \ No newline at end of file diff --git a/app/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailFragment.kt b/app/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailFragment.kt index 8598fceaef..9a8c06b777 100644 --- a/app/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailFragment.kt +++ b/app/src/main/java/im/vector/riotredesign/features/home/room/detail/RoomDetailFragment.kt @@ -34,8 +34,7 @@ class RoomDetailFragment : RiotFragment() { private val matrix by inject() private val currentSession = matrix.currentSession private var roomId by FragmentArgumentDelegate() - - private lateinit var timelineEventController: TimelineEventController + private val timelineEventController by inject() 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) } diff --git a/app/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/TimelineDateFormatter.kt b/app/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/TimelineDateFormatter.kt new file mode 100644 index 0000000000..4b1811b91b --- /dev/null +++ b/app/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/TimelineDateFormatter.kt @@ -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) + } + +} \ No newline at end of file diff --git a/app/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/TimelineEventController.kt b/app/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/TimelineEventController.kt index 424133edf9..0fef3fcb89 100644 --- a/app/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/TimelineEventController.kt +++ b/app/src/main/java/im/vector/riotredesign/features/home/room/detail/timeline/TimelineEventController.kt @@ -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) } } diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/Matrix.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/Matrix.kt index ee5d4969d8..88bf3c3eb3 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/Matrix.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/Matrix.kt @@ -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 diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionModule.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionModule.kt index 974efa90ff..afb84d760c 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionModule.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/session/SessionModule.kt @@ -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) {