mirror of
https://github.com/nextcloud/talk-android
synced 2025-07-14 16:25:05 +01:00
Localize time formatting
Signed-off-by: jld3103 <jld3103yt@gmail.com>
This commit is contained in:
parent
015ddc5b1f
commit
6aece2940e
@ -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")
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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!!)
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user