Localize time formatting

Signed-off-by: jld3103 <jld3103yt@gmail.com>
This commit is contained in:
jld3103 2022-09-30 14:19:21 +02:00 committed by Andy Scherzinger
parent 015ddc5b1f
commit 6aece2940e
No known key found for this signature in database
GPG Key ID: 6CADC7E3523C308B
7 changed files with 62 additions and 31 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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