mirror of
https://github.com/nextcloud/talk-android
synced 2025-07-15 00:35:04 +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
|
||||||
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")
|
||||||
|
@ -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 {
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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!!)
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user