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.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")

View File

@ -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 {

View File

@ -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

View File

@ -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)
}
}

View File

@ -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!!)

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.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
}
}

View File

@ -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
/* 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 {
val cal = Calendar.getInstance()
val tz = cal.timeZone
/* 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)
}