diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt index c44e91890..9e65b68b5 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.kt +++ b/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") diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt b/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt index a44f16f4b..82833debb 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.kt +++ b/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 { diff --git a/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt b/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt index 1c73844c2..4ff365dae 100644 --- a/app/src/main/java/com/nextcloud/talk/dagger/modules/RepositoryModule.kt +++ b/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 diff --git a/app/src/main/java/com/nextcloud/talk/dagger/modules/UtilsModule.kt b/app/src/main/java/com/nextcloud/talk/dagger/modules/UtilsModule.kt index cd765c5d2..b3b8303dc 100644 --- a/app/src/main/java/com/nextcloud/talk/dagger/modules/UtilsModule.kt +++ b/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) + } } diff --git a/app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsListViewHolder.kt b/app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsListViewHolder.kt index b1e10a118..cb8330096 100644 --- a/app/src/main/java/com/nextcloud/talk/remotefilebrowser/adapters/RemoteFileBrowserItemsListViewHolder.kt +++ b/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!!) diff --git a/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt b/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt index e012bb18b..bde69aabf 100644 --- a/app/src/main/java/com/nextcloud/talk/shareditems/repositories/SharedItemsRepositoryImpl.kt +++ b/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 } } diff --git a/app/src/main/java/com/nextcloud/talk/utils/DateUtils.kt b/app/src/main/java/com/nextcloud/talk/utils/DateUtils.kt index 8748c74b4..6f32260f7 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/DateUtils.kt +++ b/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 + /* 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) }