Browse Source

Localize time formatting

Signed-off-by: jld3103 <jld3103yt@gmail.com>
jld3103 2 năm trước cách đây
mục cha
commit
6aece2940e

+ 7 - 3
app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt

@@ -164,6 +164,7 @@ import com.nextcloud.talk.utils.ApiUtils
 import com.nextcloud.talk.utils.ConductorRemapping
 import com.nextcloud.talk.utils.ConductorRemapping.remapChatController
 import com.nextcloud.talk.utils.ContactUtils
+import com.nextcloud.talk.utils.DateConstants
 import com.nextcloud.talk.utils.DateUtils
 import com.nextcloud.talk.utils.FileUtils
 import com.nextcloud.talk.utils.ImageEmojiEditText
@@ -243,6 +244,9 @@ class ChatController(args: Bundle) :
     @Inject
     lateinit var permissionUtil: PlatformPermissionUtil
 
+    @Inject
+    lateinit var dateUtils: DateUtils
+
     val disposables = DisposableSet()
 
     var roomToken: String? = null
@@ -1348,12 +1352,12 @@ class ChatController(args: Bundle) :
                 if (currentConversation?.lobbyTimer != null && currentConversation?.lobbyTimer !=
                     0L
                 ) {
-                    val timestamp = currentConversation?.lobbyTimer ?: 0
+                    val timestampMS = (currentConversation?.lobbyTimer ?: 0) * DateConstants.SECOND_DIVIDER
                     val stringWithStartDate = String.format(
                         resources!!.getString(R.string.nc_lobby_start_date),
-                        DateUtils.getLocalDateStringFromTimestampForLobby(timestamp)
+                        dateUtils.getLocalDateTimeStringFromTimestamp(timestampMS)
                     )
-                    val relativeTime = DateUtils.relativeStartTimeForLobby(timestamp, resources!!)
+                    val relativeTime = dateUtils.relativeStartTimeForLobby(timestampMS, resources!!)
 
                     sb.append("$stringWithStartDate - $relativeTime")
                         .append("\n\n")

+ 5 - 2
app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt

@@ -118,6 +118,9 @@ class ConversationInfoController(args: Bundle) :
     @Inject
     lateinit var eventBus: EventBus
 
+    @Inject
+    lateinit var dateUtils: DateUtils
+
     private val conversationToken: String?
     private val conversationUser: User?
     private val hasAvatarSpacing: Boolean
@@ -311,8 +314,8 @@ class ConversationInfoController(args: Bundle) :
             conversation!!.lobbyTimer != 0L
         ) {
             binding.webinarInfoView.startTimePreferences.setSummary(
-                DateUtils.getLocalDateStringFromTimestampForLobby(
-                    conversation!!.lobbyTimer!!
+                dateUtils.getLocalDateTimeStringFromTimestamp(
+                    conversation!!.lobbyTimer!! * DateConstants.SECOND_DIVIDER,
                 )
             )
         } else {

+ 6 - 1
app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt

@@ -43,14 +43,19 @@ import com.nextcloud.talk.repositories.unifiedsearch.UnifiedSearchRepository
 import com.nextcloud.talk.repositories.unifiedsearch.UnifiedSearchRepositoryImpl
 import com.nextcloud.talk.shareditems.repositories.SharedItemsRepository
 import com.nextcloud.talk.shareditems.repositories.SharedItemsRepositoryImpl
+import com.nextcloud.talk.utils.DateUtils
 import com.nextcloud.talk.utils.database.user.CurrentUserProviderNew
 import dagger.Module
 import dagger.Provides
 import okhttp3.OkHttpClient
+import javax.inject.Inject
 
 @Module
 class RepositoryModule {
 
+    @Inject
+    lateinit var dateUtils: DateUtils
+
     @Provides
     fun provideConversationsRepository(ncApi: NcApi, userProvider: CurrentUserProviderNew): ConversationsRepository {
         return ConversationsRepositoryImpl(ncApi, userProvider)
@@ -58,7 +63,7 @@ class RepositoryModule {
 
     @Provides
     fun provideSharedItemsRepository(ncApi: NcApi): SharedItemsRepository {
-        return SharedItemsRepositoryImpl(ncApi)
+        return SharedItemsRepositoryImpl(ncApi, dateUtils)
     }
 
     @Provides

+ 7 - 0
app/src/main/java/com/nextcloud/talk/dagger/modules/UtilsModule.kt

@@ -22,6 +22,7 @@
 package com.nextcloud.talk.dagger.modules
 
 import android.content.Context
+import com.nextcloud.talk.utils.DateUtils
 import com.nextcloud.talk.utils.permissions.PlatformPermissionUtil
 import com.nextcloud.talk.utils.permissions.PlatformPermissionUtilImpl
 import dagger.Module
@@ -35,4 +36,10 @@ class UtilsModule {
     fun providePermissionUtil(context: Context): PlatformPermissionUtil {
         return PlatformPermissionUtilImpl(context)
     }
+
+    @Provides
+    @Reusable
+    fun provideDateUtils(context: Context): DateUtils {
+        return DateUtils(context)
+    }
 }

+ 6 - 2
app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsListViewHolder.kt

@@ -33,8 +33,9 @@ import com.nextcloud.talk.remotefilebrowser.SelectionInterface
 import com.nextcloud.talk.remotefilebrowser.model.RemoteFileBrowserItem
 import com.nextcloud.talk.ui.theme.ViewThemeUtils
 import com.nextcloud.talk.utils.ApiUtils
-import com.nextcloud.talk.utils.DateUtils.getLocalDateTimeStringFromTimestamp
+import com.nextcloud.talk.utils.DateUtils
 import com.nextcloud.talk.utils.Mimetype.FOLDER
+import javax.inject.Inject
 
 @AutoInjector(NextcloudTalkApplication::class)
 class RemoteFileBrowserItemsListViewHolder(
@@ -46,6 +47,9 @@ class RemoteFileBrowserItemsListViewHolder(
     onItemClicked: (Int) -> Unit
 ) : RemoteFileBrowserItemsViewHolder(binding, mimeTypeSelectionFilter, currentUser, selectionInterface) {
 
+    @Inject
+    lateinit var dateUtils: DateUtils
+
     override val fileIcon: ImageView
         get() = binding.fileIcon
 
@@ -111,7 +115,7 @@ class RemoteFileBrowserItemsListViewHolder(
         binding.fileModifiedInfo.text = String.format(
             binding.fileModifiedInfo.context.getString(R.string.nc_last_modified),
             Formatter.formatShortFileSize(binding.fileModifiedInfo.context, item.size),
-            getLocalDateTimeStringFromTimestamp(item.modifiedTimestamp)
+            dateUtils.getLocalDateTimeStringFromTimestamp(item.modifiedTimestamp)
         )
 
         binding.selectFileCheckbox.isChecked = selectionInterface.isPathSelected(item.path!!)

+ 8 - 4
app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt

@@ -37,6 +37,7 @@ import com.nextcloud.talk.shareditems.model.SharedLocationItem
 import com.nextcloud.talk.shareditems.model.SharedOtherItem
 import com.nextcloud.talk.shareditems.model.SharedPollItem
 import com.nextcloud.talk.utils.ApiUtils
+import com.nextcloud.talk.utils.DateConstants
 import com.nextcloud.talk.utils.DateUtils
 import io.reactivex.Observable
 import retrofit2.Response
@@ -44,7 +45,8 @@ import java.util.HashMap
 import java.util.Locale
 import javax.inject.Inject
 
-class SharedItemsRepositoryImpl @Inject constructor(private val ncApi: NcApi) : SharedItemsRepository {
+class SharedItemsRepositoryImpl @Inject constructor(private val ncApi: NcApi, private val dateUtils: DateUtils) :
+    SharedItemsRepository {
 
     override fun media(
         parameters: SharedItemsRepository.Parameters,
@@ -86,8 +88,8 @@ class SharedItemsRepositoryImpl @Inject constructor(private val ncApi: NcApi) :
         if (mediaItems != null) {
             for (it in mediaItems) {
                 val actorParameters = it.value.messageParameters!!["actor"]!!
-                val dateTime = DateUtils.getLocalDateTimeStringFromTimestamp(
-                    it.value.timestamp * ONE_SECOND_IN_MILLIS
+                val dateTime = dateUtils.getLocalDateTimeStringFromTimestamp(
+                    it.value.timestamp * DateConstants.SECOND_DIVIDER
                 )
 
                 if (it.value.messageParameters?.containsKey("file") == true) {
@@ -145,6 +147,7 @@ class SharedItemsRepositoryImpl @Inject constructor(private val ncApi: NcApi) :
                     dateTime
                 )
             }
+
             "geo-location" -> {
                 returnValue = SharedLocationItem(
                     objectParameters["id"]!!,
@@ -155,6 +158,7 @@ class SharedItemsRepositoryImpl @Inject constructor(private val ncApi: NcApi) :
                     Uri.parse(objectParameters["id"]!!.replace("geo:", "geo:0,0?z=11&q="))
                 )
             }
+
             "deck-card" -> {
                 returnValue = SharedDeckCardItem(
                     objectParameters["id"]!!,
@@ -165,6 +169,7 @@ class SharedItemsRepositoryImpl @Inject constructor(private val ncApi: NcApi) :
                     Uri.parse(objectParameters["link"]!!)
                 )
             }
+
             else -> {
                 returnValue = SharedOtherItem(
                     objectParameters["id"]!!,
@@ -212,7 +217,6 @@ class SharedItemsRepositoryImpl @Inject constructor(private val ncApi: NcApi) :
 
     companion object {
         const val BATCH_SIZE: Int = 28
-        private const val ONE_SECOND_IN_MILLIS = 1000
         private val TAG = SharedItemsRepositoryImpl::class.simpleName
     }
 }

+ 23 - 19
app/src/main/java/com/nextcloud/talk/utils/DateUtils.kt

@@ -20,6 +20,7 @@
 
 package com.nextcloud.talk.utils
 
+import android.content.Context
 import android.content.res.Resources
 import android.icu.text.RelativeDateTimeFormatter
 import android.icu.text.RelativeDateTimeFormatter.Direction
@@ -29,36 +30,36 @@ import com.nextcloud.talk.R
 import java.text.DateFormat
 import java.util.Calendar
 import java.util.Date
-import java.util.Locale
 import kotlin.math.roundToInt
 
-object DateUtils {
+class DateUtils(val context: Context) {
+    private val cal = Calendar.getInstance()
+    private val tz = cal.timeZone
 
-    private const val TIMESTAMP_CORRECTION_MULTIPLIER = 1000
-
-    fun getLocalDateTimeStringFromTimestamp(timestamp: Long): String {
-        val cal = Calendar.getInstance()
-        val tz = cal.timeZone
+    /* date formatter in local timezone and locale */
+    private var format: DateFormat = DateFormat.getDateTimeInstance(
+        DateFormat.DEFAULT, // dateStyle
+        DateFormat.SHORT, // timeStyle
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            context.resources.configuration.locales[0]
+        } else {
+            @Suppress("DEPRECATION")
+            context.resources.configuration.locale
+        },
+    )
 
-        /* date formatter in local timezone */
-        val format = DateFormat.getDateTimeInstance(
-            DateFormat.DEFAULT, DateFormat.SHORT,
-            Locale.getDefault()
-        )
+    init {
         format.timeZone = tz
-
-        return format.format(Date(timestamp))
     }
 
-    fun getLocalDateStringFromTimestampForLobby(timestamp: Long): String {
-        return getLocalDateTimeStringFromTimestamp(timestamp * TIMESTAMP_CORRECTION_MULTIPLIER)
+    fun getLocalDateTimeStringFromTimestamp(timestampMilliseconds: Long): String {
+        return format.format(Date(timestampMilliseconds))
     }
 
-    fun relativeStartTimeForLobby(timestamp: Long, resources: Resources): String {
-
+    fun relativeStartTimeForLobby(timestampMilliseconds: Long, resources: Resources): String {
         return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
             val fmt = RelativeDateTimeFormatter.getInstance()
-            val timeLeftMillis = timestamp * TIMESTAMP_CORRECTION_MULTIPLIER - System.currentTimeMillis()
+            val timeLeftMillis = timestampMilliseconds - System.currentTimeMillis()
             val minutes = timeLeftMillis.toDouble() / DateConstants.SECOND_DIVIDER / DateConstants.MINUTES_DIVIDER
             val hours = minutes / DateConstants.HOURS_DIVIDER
             val days = hours / DateConstants.DAYS_DIVIDER
@@ -75,6 +76,7 @@ object DateUtils {
                         RelativeUnit.DAYS
                     )
                 }
+
                 hoursInt > 0 -> {
                     fmt.format(
                         hoursInt.toDouble(),
@@ -82,6 +84,7 @@ object DateUtils {
                         RelativeUnit.HOURS
                     )
                 }
+
                 minutesInt > 1 -> {
                     fmt.format(
                         minutesInt.toDouble(),
@@ -89,6 +92,7 @@ object DateUtils {
                         RelativeUnit.MINUTES
                     )
                 }
+
                 else -> {
                     resources.getString(R.string.nc_lobby_start_soon)
                 }