diff --git a/app/src/main/java/com/nextcloud/client/assistant/AssistantViewModel.kt b/app/src/main/java/com/nextcloud/client/assistant/AssistantViewModel.kt index 989bd26a1c97..e1d4d90cbef1 100644 --- a/app/src/main/java/com/nextcloud/client/assistant/AssistantViewModel.kt +++ b/app/src/main/java/com/nextcloud/client/assistant/AssistantViewModel.kt @@ -13,7 +13,7 @@ import com.nextcloud.client.assistant.model.AssistantScreenState import com.nextcloud.client.assistant.model.ScreenOverlayState import com.nextcloud.client.assistant.repository.local.AssistantLocalRepository import com.nextcloud.client.assistant.repository.remote.AssistantRemoteRepository -import com.nextcloud.utils.TimeConstants.MILLIS_PER_SECOND +import com.nextcloud.utils.AppConstants.MILLIS_PER_SECOND import com.owncloud.android.R import com.owncloud.android.lib.common.utils.Log_OC import com.owncloud.android.lib.resources.assistant.v2.model.Task diff --git a/app/src/main/java/com/nextcloud/client/assistant/chat/ChatContent.kt b/app/src/main/java/com/nextcloud/client/assistant/chat/ChatContent.kt index 65a446fabf3c..3fc0b6dbe766 100644 --- a/app/src/main/java/com/nextcloud/client/assistant/chat/ChatContent.kt +++ b/app/src/main/java/com/nextcloud/client/assistant/chat/ChatContent.kt @@ -66,7 +66,7 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.nextcloud.utils.TimeConstants +import com.nextcloud.utils.AppConstants import com.nextcloud.utils.extensions.time import com.owncloud.android.R import com.owncloud.android.lib.resources.assistant.chat.model.ChatMessage @@ -304,7 +304,7 @@ private fun AnimatedAssistantIcon() { initialValue = 1f, targetValue = 1.1f, animationSpec = infiniteRepeatable( - animation = tween(TimeConstants.MILLIS_PER_SECOND, easing = LinearEasing), + animation = tween(AppConstants.MILLIS_PER_SECOND, easing = LinearEasing), repeatMode = RepeatMode.Reverse ), label = "scale_animation" diff --git a/app/src/main/java/com/nextcloud/client/assistant/chat/ChatViewModel.kt b/app/src/main/java/com/nextcloud/client/assistant/chat/ChatViewModel.kt index 9a6e4c2027ce..7211b1f590f1 100644 --- a/app/src/main/java/com/nextcloud/client/assistant/chat/ChatViewModel.kt +++ b/app/src/main/java/com/nextcloud/client/assistant/chat/ChatViewModel.kt @@ -10,7 +10,7 @@ package com.nextcloud.client.assistant.chat import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.nextcloud.client.assistant.repository.remote.AssistantRemoteRepository -import com.nextcloud.utils.TimeConstants.MILLIS_PER_SECOND +import com.nextcloud.utils.AppConstants.MILLIS_PER_SECOND import com.nextcloud.utils.date.DateFormatPattern import com.nextcloud.utils.date.DateFormatter import com.nextcloud.utils.extensions.isHuman diff --git a/app/src/main/java/com/nextcloud/client/assistant/conversation/ConversationViewModel.kt b/app/src/main/java/com/nextcloud/client/assistant/conversation/ConversationViewModel.kt index a887f31f5ab5..e3627ea76758 100644 --- a/app/src/main/java/com/nextcloud/client/assistant/conversation/ConversationViewModel.kt +++ b/app/src/main/java/com/nextcloud/client/assistant/conversation/ConversationViewModel.kt @@ -11,7 +11,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.nextcloud.client.assistant.conversation.model.ConversationScreenState import com.nextcloud.client.assistant.conversation.repository.ConversationRemoteRepository -import com.nextcloud.utils.TimeConstants.MILLIS_PER_SECOND +import com.nextcloud.utils.AppConstants.MILLIS_PER_SECOND import com.owncloud.android.R import com.owncloud.android.lib.common.utils.Log_OC import com.owncloud.android.lib.resources.assistant.chat.model.Conversation diff --git a/app/src/main/java/com/nextcloud/client/assistant/extensions/TaskExtensions.kt b/app/src/main/java/com/nextcloud/client/assistant/extensions/TaskExtensions.kt index 5bc6dacf6a0d..93137dc5741e 100644 --- a/app/src/main/java/com/nextcloud/client/assistant/extensions/TaskExtensions.kt +++ b/app/src/main/java/com/nextcloud/client/assistant/extensions/TaskExtensions.kt @@ -17,6 +17,9 @@ import com.owncloud.android.lib.resources.assistant.v2.model.Task import com.owncloud.android.lib.resources.status.NextcloudVersion import com.owncloud.android.lib.resources.status.OCCapability import java.util.concurrent.TimeUnit +import com.nextcloud.utils.AppConstants.MILLIS_PER_SECOND +import com.nextcloud.utils.AppConstants.MINUTES_PER_HOUR +import com.nextcloud.utils.AppConstants.SECONDS_PER_MINUTE fun Task.getInputAndOutput(): String { val inputText = input?.input ?: "" @@ -157,17 +160,16 @@ private fun Task.getStatusIconDescriptionV2(): Int = when (status) { } } -@Suppress("MagicNumber") fun Task.getModifiedAtRepresentation(context: Context): String? { if (lastUpdated == null) { return null } val modifiedAt = lastUpdated!!.toLong() - val currentTime = System.currentTimeMillis() / 1000 + val currentTime = System.currentTimeMillis() / MILLIS_PER_SECOND val timeDifference = (currentTime - modifiedAt).toInt() - val timeDifferenceInMinutes = (timeDifference / 60) - val timeDifferenceInHours = (timeDifference / 3600) + val timeDifferenceInMinutes = (timeDifference / SECONDS_PER_MINUTE) + val timeDifferenceInHours = (timeDifference / (SECONDS_PER_MINUTE * MINUTES_PER_HOUR)) return when { timeDifference < 0 -> { diff --git a/app/src/main/java/com/nextcloud/client/assistant/repository/remote/AssistantRemoteRepositoryImpl.kt b/app/src/main/java/com/nextcloud/client/assistant/repository/remote/AssistantRemoteRepositoryImpl.kt index 596e5353b3b9..41f2042bda81 100644 --- a/app/src/main/java/com/nextcloud/client/assistant/repository/remote/AssistantRemoteRepositoryImpl.kt +++ b/app/src/main/java/com/nextcloud/client/assistant/repository/remote/AssistantRemoteRepositoryImpl.kt @@ -7,7 +7,7 @@ package com.nextcloud.client.assistant.repository.remote import com.nextcloud.common.NextcloudClient -import com.nextcloud.utils.TimeConstants +import com.nextcloud.utils.AppConstants import com.owncloud.android.lib.common.operations.RemoteOperationResult import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode import com.owncloud.android.lib.resources.assistant.chat.CheckGenerationRemoteOperation @@ -106,7 +106,7 @@ class AssistantRemoteRepositoryImpl(private val client: NextcloudClient, capabil } override suspend fun createConversation(title: String): CreateConversation? = withContext(Dispatchers.IO) { - val timestamp = System.currentTimeMillis().div(TimeConstants.MILLIS_PER_SECOND) + val timestamp = System.currentTimeMillis().div(AppConstants.MILLIS_PER_SECOND) val result = CreateConversationRemoteOperation(title, timestamp).execute(client) if (result.isSuccess) result.resultData else null } diff --git a/app/src/main/java/com/nextcloud/client/assistant/task/TaskStatusView.kt b/app/src/main/java/com/nextcloud/client/assistant/task/TaskStatusView.kt index 81d85032b1b8..0db39cc95c27 100644 --- a/app/src/main/java/com/nextcloud/client/assistant/task/TaskStatusView.kt +++ b/app/src/main/java/com/nextcloud/client/assistant/task/TaskStatusView.kt @@ -36,6 +36,7 @@ import com.owncloud.android.lib.resources.assistant.v2.model.TaskInput import com.owncloud.android.lib.resources.assistant.v2.model.TaskOutput import com.owncloud.android.lib.resources.status.OCCapability import java.util.concurrent.TimeUnit +import com.nextcloud.utils.AppConstants.MILLIS_PER_SECOND @Composable fun TaskStatusView(task: Task, capability: OCCapability) { @@ -72,7 +73,7 @@ fun TaskStatusView(task: Task, capability: OCCapability) { @Composable @Preview private fun TaskStatusViewPreview() { - val currentTime = System.currentTimeMillis() / 1000 + val currentTime = System.currentTimeMillis() / MILLIS_PER_SECOND val tasks = listOf( Task( diff --git a/app/src/main/java/com/nextcloud/client/di/AppModule.kt b/app/src/main/java/com/nextcloud/client/di/AppModule.kt index 7b5370afeae2..61d9a9595f84 100644 --- a/app/src/main/java/com/nextcloud/client/di/AppModule.kt +++ b/app/src/main/java/com/nextcloud/client/di/AppModule.kt @@ -70,6 +70,7 @@ import java.io.File import javax.inject.Named import javax.inject.Provider import javax.inject.Singleton +import com.nextcloud.utils.AppConstants.BYTES_PER_MB @Module(includes = [ComponentsModule::class, VariantComponentsModule::class, BuildTypeComponentsModule::class]) @Suppress("TooManyFunctions") @@ -266,7 +267,7 @@ internal class AppModule { companion object { private const val LOG_DIR_NAME = "logs" private const val LOG_FILE_NAME = "log.txt" - private const val LOG_FILE_MAX_SIZE_BYTES = 1024L * 1024L + private const val LOG_FILE_MAX_SIZE_BYTES = BYTES_PER_MB.toLong() private const val LOGGER_QUEUE_CAPACITY = 1000 private const val UI_THREAD_POOL_SIZE = 4 private const val IO_THREAD_POOL_SIZE = 8 diff --git a/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt b/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt index 573811352c5d..86b49c3b47fb 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/BackgroundJobManagerImpl.kt @@ -54,6 +54,7 @@ import java.util.Date import java.util.UUID import java.util.concurrent.TimeUnit import kotlin.reflect.KClass +import kotlin.time.Duration.Companion.days /** * Note to maintainers @@ -119,14 +120,14 @@ internal class BackgroundJobManagerImpl( const val TAG_PREFIX_START_TIMESTAMP = "timestamp" val PREFIXES = setOf(TAG_PREFIX_NAME, TAG_PREFIX_USER, TAG_PREFIX_START_TIMESTAMP, TAG_PREFIX_CLASS) const val NOT_SET_VALUE = "not set" - const val PERIODIC_BACKUP_INTERVAL_MINUTES = 24 * 60L + val PERIODIC_BACKUP_INTERVAL_MINUTES = 1.days.inWholeMinutes const val DEFAULT_PERIODIC_JOB_INTERVAL_MINUTES = 15L const val OFFLINE_OPERATIONS_PERIODIC_JOB_INTERVAL_MINUTES = 5L const val DEFAULT_IMMEDIATE_JOB_DELAY_SEC = 3L const val DEFAULT_BACKOFF_CRITERIA_DELAY_SEC = 300L const val ALBUM_JOB_FILES_UPLOAD = "album_files_upload" - private const val KEEP_LOG_MILLIS = 1000 * 60 * 60 * 24 * 3L + private val KEEP_LOG_MILLIS = 3.days.inWholeMilliseconds fun formatNameTag(name: String, user: User? = null): String = if (user == null) { "$TAG_PREFIX_NAME:$name" diff --git a/app/src/main/java/com/nextcloud/client/jobs/CalendarBackupWork.kt b/app/src/main/java/com/nextcloud/client/jobs/CalendarBackupWork.kt index e65554204ad6..5e3f3e50f7ad 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/CalendarBackupWork.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/CalendarBackupWork.kt @@ -18,6 +18,7 @@ import com.owncloud.android.lib.common.utils.Log_OC import thirdparties.sufficientlysecure.AndroidCalendar import thirdparties.sufficientlysecure.SaveCalendar import java.util.Calendar +import kotlin.time.Duration.Companion.days class CalendarBackupWork( appContext: Context, @@ -31,7 +32,7 @@ class CalendarBackupWork( val TAG = CalendarBackupWork::class.java.simpleName const val ACCOUNT = "account" const val FORCE = "force" - const val JOB_INTERVAL_MS: Long = 24 * 60 * 60 * 1000 + val JOB_INTERVAL_MS = 1.days.inWholeMilliseconds } override fun doWork(): Result { diff --git a/app/src/main/java/com/nextcloud/client/jobs/ContactsBackupWork.kt b/app/src/main/java/com/nextcloud/client/jobs/ContactsBackupWork.kt index 4a01346dc993..e6677856b7d0 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/ContactsBackupWork.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/ContactsBackupWork.kt @@ -43,6 +43,7 @@ import java.io.IOException import java.io.InputStream import java.io.InputStreamReader import java.util.Calendar +import kotlin.time.Duration.Companion.days @Suppress("LongParameterList") // legacy code class ContactsBackupWork( @@ -58,7 +59,7 @@ class ContactsBackupWork( val TAG = ContactsBackupWork::class.java.simpleName const val KEY_ACCOUNT = "account" const val KEY_FORCE = "force" - const val JOB_INTERVAL_MS: Long = 24L * 60L * 60L * 1000L + val JOB_INTERVAL_MS = 1.days.inWholeMilliseconds const val BUFFER_SIZE = 1024 } diff --git a/app/src/main/java/com/nextcloud/client/jobs/TestJob.kt b/app/src/main/java/com/nextcloud/client/jobs/TestJob.kt index 2d700420925b..37590cea3c1b 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/TestJob.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/TestJob.kt @@ -10,21 +10,22 @@ import android.content.Context import androidx.work.Data import androidx.work.Worker import androidx.work.WorkerParameters +import com.nextcloud.utils.AppConstants.PROGRESS_PERCENTAGE_MAX +import com.nextcloud.utils.AppConstants.PROGRESS_PERCENTAGE_MIN +import com.nextcloud.utils.AppConstants.ONE_SECOND class TestJob(appContext: Context, params: WorkerParameters, private val backgroundJobManager: BackgroundJobManager) : Worker(appContext, params) { companion object { - private const val MAX_PROGRESS = 100 - private const val DELAY_MS = 1000L private const val PROGRESS_KEY = "progress" } override fun doWork(): Result { backgroundJobManager.logStartOfWorker(BackgroundJobManagerImpl.formatClassTag(this::class)) - for (i in 0..MAX_PROGRESS) { - Thread.sleep(DELAY_MS) + for (i in PROGRESS_PERCENTAGE_MIN..PROGRESS_PERCENTAGE_MAX) { + Thread.sleep(ONE_SECOND.inWholeMilliseconds) val progress = Data.Builder() .putInt(PROGRESS_KEY, i) .build() diff --git a/app/src/main/java/com/nextcloud/client/jobs/autoUpload/AutoUploadLocalDeletionWorker.kt b/app/src/main/java/com/nextcloud/client/jobs/autoUpload/AutoUploadLocalDeletionWorker.kt index 2d2844f01cb8..ecba6c0a465b 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/autoUpload/AutoUploadLocalDeletionWorker.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/autoUpload/AutoUploadLocalDeletionWorker.kt @@ -24,6 +24,7 @@ import com.owncloud.android.ui.notifications.NotificationUtils import com.owncloud.android.utils.FileUtil import com.owncloud.android.utils.theme.ViewThemeUtils import java.io.File +import kotlin.time.Duration.Companion.milliseconds class AutoUploadLocalDeletionWorker( private val context: Context, @@ -36,7 +37,6 @@ class AutoUploadLocalDeletionWorker( companion object { const val SYNCED_FOLDER_IDS = "synced_folder_IDs" const val NOTIFICATION_ID = 267 - const val MS_IN_SECOND = 1000 private const val TAG = "AutoUploadLocalDeletionWorker" } @@ -107,7 +107,7 @@ class AutoUploadLocalDeletionWorker( Log_OC.d( TAG, "Success: users=$users, foldersAnalyzed=$foldersAnalyzed, filesPreserved=$filesPreserved, " + - "filesRemoved=$filesRemoved, spaceFreed=$spaceFreed bytes, runTime=${runTimeMs / MS_IN_SECOND} seconds" + "filesRemoved=$filesRemoved, spaceFreed=$spaceFreed bytes, runTime=${runTimeMs.milliseconds}" ) return Result.success() } diff --git a/app/src/main/java/com/nextcloud/client/jobs/autoUpload/FileSystemRepository.kt b/app/src/main/java/com/nextcloud/client/jobs/autoUpload/FileSystemRepository.kt index 4052bd02bf04..375e60546cbc 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/autoUpload/FileSystemRepository.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/autoUpload/FileSystemRepository.kt @@ -23,6 +23,8 @@ import com.owncloud.android.lib.common.utils.Log_OC import com.owncloud.android.utils.SyncedFolderUtils import java.io.File import java.util.zip.CRC32 +import com.nextcloud.utils.AppConstants.BYTES_PER_KB +import com.nextcloud.utils.AppConstants.MILLIS_PER_SECOND @Suppress("TooGenericExceptionCaught", "NestedBlockDepth", "MagicNumber", "ReturnCount") class FileSystemRepository( @@ -158,13 +160,13 @@ class FileSystemRepository( val filePath = cursor.getString(idxData) val lastModifiedMs = if (idxModified != -1) { - cursor.getLong(idxModified) * 1000 + cursor.getLong(idxModified) * MILLIS_PER_SECOND } else { null } val creationTimeMs = if (idxAdded != -1) { - cursor.getLong(idxAdded) * 1000 + cursor.getLong(idxAdded) * MILLIS_PER_SECOND } else { null } @@ -289,7 +291,7 @@ class FileSystemRepository( private fun getFileChecksum(file: File): Long? = try { file.inputStream().use { fis -> val crc = CRC32() - val buffer = ByteArray(64 * 1024) + val buffer = ByteArray(64 * BYTES_PER_KB) var bytesRead: Int while (fis.read(buffer).also { bytesRead = it } > 0) { crc.update(buffer, 0, bytesRead) diff --git a/app/src/main/java/com/nextcloud/client/jobs/folderDownload/FolderDownloadWorkerNotificationManager.kt b/app/src/main/java/com/nextcloud/client/jobs/folderDownload/FolderDownloadWorkerNotificationManager.kt index d48d7fd1e547..2ea8d595827d 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/folderDownload/FolderDownloadWorkerNotificationManager.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/folderDownload/FolderDownloadWorkerNotificationManager.kt @@ -21,6 +21,7 @@ import com.owncloud.android.utils.theme.ViewThemeUtils import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import kotlin.random.Random +import com.nextcloud.utils.AppConstants.PROGRESS_PERCENTAGE_MAX class FolderDownloadWorkerNotificationManager( private val context: Context, @@ -36,7 +37,6 @@ class FolderDownloadWorkerNotificationManager( companion object { private const val NOTIFICATION_ID = 391 - private const val MAX_PROGRESS = 100 } private fun getNotification(title: String, description: String = "", progress: Int? = null): Notification = @@ -47,7 +47,7 @@ class FolderDownloadWorkerNotificationManager( setContentText(description) if (progress != null) { - setProgress(MAX_PROGRESS, progress, false) + setProgress(PROGRESS_PERCENTAGE_MAX, progress, false) if (showCancel) { addAction( R.drawable.ic_cancel, @@ -79,7 +79,7 @@ class FolderDownloadWorkerNotificationManager( val currentFileIndex = (currentIndex + 1) val description = context.getString(R.string.folder_download_counter, currentFileIndex, totalFileSize, filename) - val progress = (currentFileIndex * MAX_PROGRESS) / totalFileSize + val progress = (currentFileIndex * PROGRESS_PERCENTAGE_MAX) / totalFileSize val notification = getNotification(folderName, description, progress) showNotification(notification) } diff --git a/app/src/main/java/com/nextcloud/client/jobs/offlineOperations/OfflineOperationsNotificationManager.kt b/app/src/main/java/com/nextcloud/client/jobs/offlineOperations/OfflineOperationsNotificationManager.kt index fce69c3c71a4..ae677f5dfbc2 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/offlineOperations/OfflineOperationsNotificationManager.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/offlineOperations/OfflineOperationsNotificationManager.kt @@ -22,6 +22,7 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult import com.owncloud.android.ui.activity.ConflictsResolveActivity import com.owncloud.android.ui.notifications.NotificationUtils import com.owncloud.android.utils.theme.ViewThemeUtils +import com.nextcloud.utils.AppConstants.PROGRESS_PERCENTAGE_MAX class OfflineOperationsNotificationManager(private val context: Context, viewThemeUtils: ViewThemeUtils) : WorkerNotificationManager( @@ -35,14 +36,12 @@ class OfflineOperationsNotificationManager(private val context: Context, viewThe companion object { private const val ID = 121 const val ERROR_ID = 122 - - private const val ONE_HUNDRED_PERCENT = 100 } fun start() { notificationBuilder.run { setContentTitle(context.getString(R.string.offline_operations_worker_notification_start_text)) - setProgress(ONE_HUNDRED_PERCENT, 0, false) + setProgress(PROGRESS_PERCENTAGE_MAX, 0, false) } showNotification() @@ -60,11 +59,11 @@ class OfflineOperationsNotificationManager(private val context: Context, viewThe filename } - val progress = (currentOperationIndex * ONE_HUNDRED_PERCENT) / totalOperationSize + val progress = (currentOperationIndex * PROGRESS_PERCENTAGE_MAX) / totalOperationSize notificationBuilder.run { setContentTitle(title) - setProgress(ONE_HUNDRED_PERCENT, progress, false) + setProgress(PROGRESS_PERCENTAGE_MAX, progress, false) } showNotification() diff --git a/app/src/main/java/com/nextcloud/client/jobs/offlineOperations/OfflineOperationsWorker.kt b/app/src/main/java/com/nextcloud/client/jobs/offlineOperations/OfflineOperationsWorker.kt index 464f07ddab44..3661cf002f00 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/offlineOperations/OfflineOperationsWorker.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/offlineOperations/OfflineOperationsWorker.kt @@ -35,6 +35,7 @@ import com.owncloud.android.utils.MimeTypeUtil import com.owncloud.android.utils.theme.ViewThemeUtils import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext +import com.nextcloud.utils.AppConstants.MILLIS_PER_SECOND private typealias OfflineOperationResult = Pair?, RemoteOperation<*>?>? @@ -49,8 +50,6 @@ class OfflineOperationsWorker( companion object { private val TAG = OfflineOperationsWorker::class.java.simpleName const val JOB_NAME = "JOB_NAME" - - private const val ONE_SECOND = 1000L } private val fileDataStorageManager = FileDataStorageManager(user, context.contentResolver) @@ -269,7 +268,7 @@ class OfflineOperationsWorker( @Suppress("DEPRECATION") private fun createFile(operation: OfflineOperationEntity, client: OwnCloudClient): OfflineOperationResult { val operationType = (operation.type as OfflineOperationType.CreateFile) - val lastModificationDate = System.currentTimeMillis() / ONE_SECOND + val lastModificationDate = System.currentTimeMillis() / MILLIS_PER_SECOND val createFileOperation = UploadFileRemoteOperation( operationType.localPath, operationType.remotePath, diff --git a/app/src/main/java/com/nextcloud/client/jobs/transfer/TransferManagerImpl.kt b/app/src/main/java/com/nextcloud/client/jobs/transfer/TransferManagerImpl.kt index 45008febe3cd..77ac0e1679f5 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/transfer/TransferManagerImpl.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/transfer/TransferManagerImpl.kt @@ -20,6 +20,8 @@ import com.nextcloud.client.jobs.upload.UploadTask import com.owncloud.android.datamodel.OCFile import com.owncloud.android.operations.UploadFileOperation import java.util.UUID +import com.nextcloud.utils.AppConstants.PROGRESS_PERCENTAGE_MAX +import com.nextcloud.utils.AppConstants.PROGRESS_PERCENTAGE_MIN /** * Per-user file transfer manager. @@ -40,8 +42,6 @@ class TransferManagerImpl( ) : TransferManager { companion object { - const val PROGRESS_PERCENTAGE_MAX = 100 - const val PROGRESS_PERCENTAGE_MIN = 0 const val TEST_DOWNLOAD_PROGRESS_UPDATE_PERIOD_MS = 200L const val TEST_UPLOAD_PROGRESS_UPDATE_PERIOD_MS = 200L } diff --git a/app/src/main/java/com/nextcloud/client/notifications/AppNotificationManagerImpl.kt b/app/src/main/java/com/nextcloud/client/notifications/AppNotificationManagerImpl.kt index 5d7d64729974..9598d9f7fb5b 100644 --- a/app/src/main/java/com/nextcloud/client/notifications/AppNotificationManagerImpl.kt +++ b/app/src/main/java/com/nextcloud/client/notifications/AppNotificationManagerImpl.kt @@ -24,6 +24,8 @@ import com.owncloud.android.ui.preview.PreviewImageFragment import com.owncloud.android.utils.theme.ViewThemeUtils import javax.inject.Inject import javax.inject.Provider +import com.nextcloud.utils.AppConstants.PROGRESS_PERCENTAGE_MAX +import com.nextcloud.utils.AppConstants.PROGRESS_PERCENTAGE_MIN class AppNotificationManagerImpl @Inject constructor( private val context: Context, @@ -32,11 +34,6 @@ class AppNotificationManagerImpl @Inject constructor( private val viewThemeUtils: Provider ) : AppNotificationManager { - companion object { - const val PROGRESS_PERCENTAGE_MAX = 100 - const val PROGRESS_PERCENTAGE_MIN = 0 - } - private fun builder(channelId: String): NotificationCompat.Builder { val builder = NotificationCompat.Builder(context, channelId) diff --git a/app/src/main/java/com/nextcloud/client/player/PlayerModule.kt b/app/src/main/java/com/nextcloud/client/player/PlayerModule.kt index f26ceee10b45..d9bb1bce7bd2 100644 --- a/app/src/main/java/com/nextcloud/client/player/PlayerModule.kt +++ b/app/src/main/java/com/nextcloud/client/player/PlayerModule.kt @@ -23,9 +23,10 @@ import dagger.Provides import dagger.android.ContributesAndroidInjector import java.io.File import javax.inject.Singleton +import com.nextcloud.utils.AppConstants.BYTES_PER_MB private const val PLAYER_CACHE_DIR_NAME = "player" -private const val PLAYER_CACHE_SIZE = 300 * 1024 * 1024L +private const val PLAYER_CACHE_SIZE = 300L * BYTES_PER_MB @Module(includes = [PlayerModule.AndroidInjector::class]) class PlayerModule { diff --git a/app/src/main/java/com/nextcloud/client/player/media3/PlaybackModel.kt b/app/src/main/java/com/nextcloud/client/player/media3/PlaybackModel.kt index 2819863c4b72..93da645e7286 100644 --- a/app/src/main/java/com/nextcloud/client/player/media3/PlaybackModel.kt +++ b/app/src/main/java/com/nextcloud/client/player/media3/PlaybackModel.kt @@ -47,6 +47,7 @@ import javax.inject.Inject import javax.inject.Singleton import kotlin.coroutines.resume import kotlin.coroutines.resumeWithException +import com.nextcloud.utils.AppConstants.ONE_SECOND @Singleton @OptIn(markerClass = [UnstableApi::class]) @@ -57,10 +58,6 @@ class PlaybackModel @Inject constructor( private val playbackSettings: PlaybackSettings ) { - companion object { - private const val CHECK_PROGRESS_INTERVAL = 1000L - } - interface Listener { fun onPlaybackUpdate(state: PlaybackState) fun onPlaybackError(error: Throwable) = Unit @@ -68,7 +65,7 @@ class PlaybackModel @Inject constructor( private val listeners = mutableListOf() - private val checkProgressPeriodicAction = PeriodicAction(CHECK_PROGRESS_INTERVAL) { + private val checkProgressPeriodicAction = PeriodicAction(ONE_SECOND.inWholeMilliseconds) { notifyPlaybackUpdate() } diff --git a/app/src/main/java/com/nextcloud/client/player/ui/control/PlayerControlView.kt b/app/src/main/java/com/nextcloud/client/player/ui/control/PlayerControlView.kt index 646f04a313d7..9bcae7825819 100644 --- a/app/src/main/java/com/nextcloud/client/player/ui/control/PlayerControlView.kt +++ b/app/src/main/java/com/nextcloud/client/player/ui/control/PlayerControlView.kt @@ -41,16 +41,16 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import javax.inject.Inject import kotlin.time.Duration.Companion.milliseconds +import com.nextcloud.utils.AppConstants.MILLIS_PER_SECOND +import com.nextcloud.utils.AppConstants.MINUTES_PER_HOUR +import com.nextcloud.utils.AppConstants.SECONDS_PER_MINUTE private const val INDETERMINATE_TIME = "--:--" private const val PROGRESS_CHANGE_DEBOUNCE_MS = 200L private const val DEFAULT_MIN_PROGRESS = 0 private const val DEFAULT_MAX_PROGRESS = 100 -private const val MILLISECONDS_IN_SECOND = 1000 -private const val MILLISECONDS_IN_HOUR = 3_600_000 -private const val SECONDS_IN_MINUTE = 60 -private const val MINUTES_IN_HOUR = 60 +private const val MILLISECONDS_IN_HOUR = MILLIS_PER_SECOND * SECONDS_PER_MINUTE * MINUTES_PER_HOUR class PlayerControlView @JvmOverloads constructor( context: Context, @@ -239,13 +239,13 @@ class PlayerControlView @JvmOverloads constructor( } private fun formatTime(current: Int, max: Int): String { - val seconds = current / MILLISECONDS_IN_SECOND - val minutes = seconds / SECONDS_IN_MINUTE - val hours = minutes / MINUTES_IN_HOUR + val seconds = current / MILLIS_PER_SECOND + val minutes = seconds / SECONDS_PER_MINUTE + val hours = minutes / MINUTES_PER_HOUR return if (max >= MILLISECONDS_IN_HOUR) { - "%02d:%02d:%02d".format(hours, minutes % MINUTES_IN_HOUR, seconds % SECONDS_IN_MINUTE) + "%02d:%02d:%02d".format(hours, minutes % MINUTES_PER_HOUR, seconds % SECONDS_PER_MINUTE) } else { - "%02d:%02d".format(minutes, seconds % SECONDS_IN_MINUTE) + "%02d:%02d".format(minutes, seconds % SECONDS_PER_MINUTE) } } } diff --git a/app/src/main/java/com/nextcloud/client/player/util/PlayerUtil.kt b/app/src/main/java/com/nextcloud/client/player/util/PlayerUtil.kt index b747a2f8b88d..5638106b7fdf 100644 --- a/app/src/main/java/com/nextcloud/client/player/util/PlayerUtil.kt +++ b/app/src/main/java/com/nextcloud/client/player/util/PlayerUtil.kt @@ -43,6 +43,7 @@ import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.callbackFlow import java.io.File import java.util.Collections +import com.nextcloud.utils.AppConstants.MILLIS_PER_SECOND @Suppress("TooManyFunctions") object PlayerUtil { @@ -52,7 +53,6 @@ object PlayerUtil { private const val PLAYBACK_FILE_KEY = "playback_file" private const val NO_INDEX = -1 private const val UNKNOWN_CONTENT_LENGTH = -1L - private const val SECOND_IN_MILLISECONDS = 1000L private const val PLAYBACK_FILE_CACHE_SIZE = 512 private val playbackFileCache = LruCache(PLAYBACK_FILE_CACHE_SIZE) @@ -188,7 +188,7 @@ object PlayerUtil { name = path?.let { File(it).name } ?: "", mimeType = resolveMimeType(), contentLength = UNKNOWN_CONTENT_LENGTH, - lastModified = sharedDate * SECOND_IN_MILLISECONDS, + lastModified = sharedDate * MILLIS_PER_SECOND, isFavorite = isFavorite ) diff --git a/app/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java b/app/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java index 4901488e5611..07d50e6f48c1 100644 --- a/app/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java +++ b/app/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java @@ -35,6 +35,7 @@ import java.util.List; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; +import java.util.concurrent.TimeUnit; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -122,7 +123,8 @@ public final class AppPreferencesImpl implements AppPreferences { private final ListenerRegistry listeners; private static final int AUTO_UPLOAD_ON_START_DEBOUNCE_IN_MINUTES = 10; - private static final long AUTO_UPLOAD_ON_START_DEBOUNCE_MS = AUTO_UPLOAD_ON_START_DEBOUNCE_IN_MINUTES * 60 * 1000L; + private static final long AUTO_UPLOAD_ON_START_DEBOUNCE_MS = + TimeUnit.MINUTES.toMillis(AUTO_UPLOAD_ON_START_DEBOUNCE_IN_MINUTES); /** * Adapter delegating raw {@link SharedPreferences.OnSharedPreferenceChangeListener} calls with key-value pairs to diff --git a/app/src/main/java/com/nextcloud/ui/SetStatusMessageBottomSheet.kt b/app/src/main/java/com/nextcloud/ui/SetStatusMessageBottomSheet.kt index f3b8c260e83e..ed161b91d435 100644 --- a/app/src/main/java/com/nextcloud/ui/SetStatusMessageBottomSheet.kt +++ b/app/src/main/java/com/nextcloud/ui/SetStatusMessageBottomSheet.kt @@ -48,6 +48,9 @@ import com.vanniktech.emoji.installForceSingleEmoji import java.util.Calendar import java.util.Locale import javax.inject.Inject +import com.nextcloud.utils.AppConstants.MILLIS_PER_SECOND +import com.nextcloud.utils.AppConstants.MINUTES_PER_HOUR +import com.nextcloud.utils.AppConstants.SECONDS_PER_MINUTE private const val POS_DONT_CLEAR = 0 private const val POS_FIFTEEN_MINUTES = 1 @@ -57,8 +60,6 @@ private const val POS_FOUR_HOURS = 4 private const val POS_TODAY = 5 private const val POS_END_OF_WEEK = 6 -private const val ONE_SECOND_IN_MILLIS = 1000 -private const val ONE_MINUTE_IN_SECONDS = 60 private const val THIRTY_MINUTES = 30 private const val FIFTEEN_MINUTES = 15 private const val FOUR_HOURS = 4 @@ -180,7 +181,7 @@ class SetStatusMessageBottomSheet(val user: User, val currentStatus: Status?) : binding.remainingClearTime.apply { binding.clearStatusMessageTextView.text = getString(R.string.clear) visibility = View.VISIBLE - text = DisplayTextFormatter.formatRelativeTimestamp(context, it.clearAt * ONE_SECOND_IN_MILLIS, true) + text = DisplayTextFormatter.formatRelativeTimestamp(context, it.clearAt * MILLIS_PER_SECOND, true) .toString() .replaceFirstChar { it.lowercase(Locale.getDefault()) } setOnClickListener { @@ -199,23 +200,23 @@ class SetStatusMessageBottomSheet(val user: User, val currentStatus: Status?) : // don't clear POS_FIFTEEN_MINUTES -> { // 15 minutes - System.currentTimeMillis() / ONE_SECOND_IN_MILLIS + FIFTEEN_MINUTES * ONE_MINUTE_IN_SECONDS + System.currentTimeMillis() / MILLIS_PER_SECOND + FIFTEEN_MINUTES * SECONDS_PER_MINUTE } POS_HALF_AN_HOUR -> { // 30 minutes - System.currentTimeMillis() / ONE_SECOND_IN_MILLIS + THIRTY_MINUTES * ONE_MINUTE_IN_SECONDS + System.currentTimeMillis() / MILLIS_PER_SECOND + THIRTY_MINUTES * SECONDS_PER_MINUTE } POS_AN_HOUR -> { // one hour - System.currentTimeMillis() / ONE_SECOND_IN_MILLIS + ONE_MINUTE_IN_SECONDS * ONE_MINUTE_IN_SECONDS + System.currentTimeMillis() / MILLIS_PER_SECOND + MINUTES_PER_HOUR * SECONDS_PER_MINUTE } POS_FOUR_HOURS -> { // four hours - System.currentTimeMillis() / ONE_SECOND_IN_MILLIS + - FOUR_HOURS * ONE_MINUTE_IN_SECONDS * ONE_MINUTE_IN_SECONDS + System.currentTimeMillis() / MILLIS_PER_SECOND + + FOUR_HOURS * MINUTES_PER_HOUR * SECONDS_PER_MINUTE } POS_TODAY -> { @@ -239,7 +240,7 @@ class SetStatusMessageBottomSheet(val user: User, val currentStatus: Status?) : private fun clearAtToUnixTime(clearAt: ClearAt?): Long = when { clearAt?.type == CLEAR_AT_TYPE_PERIOD -> { - System.currentTimeMillis() / ONE_SECOND_IN_MILLIS + clearAt.time.toLong() + System.currentTimeMillis() / MILLIS_PER_SECOND + clearAt.time.toLong() } clearAt?.type == CLEAR_AT_TYPE_END_OF && clearAt.time == "day" -> { @@ -259,7 +260,7 @@ class SetStatusMessageBottomSheet(val user: User, val currentStatus: Status?) : return date } - private fun dateToSeconds(date: Calendar) = date.timeInMillis / ONE_SECOND_IN_MILLIS + private fun dateToSeconds(date: Calendar) = date.timeInMillis / MILLIS_PER_SECOND private fun clearStatus() { asyncRunner.postQuickTask( diff --git a/app/src/main/java/com/nextcloud/ui/fileactions/FileActionsViewModel.kt b/app/src/main/java/com/nextcloud/ui/fileactions/FileActionsViewModel.kt index 7f2e120c0fd6..909b09910f27 100644 --- a/app/src/main/java/com/nextcloud/ui/fileactions/FileActionsViewModel.kt +++ b/app/src/main/java/com/nextcloud/ui/fileactions/FileActionsViewModel.kt @@ -15,7 +15,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.nextcloud.client.account.CurrentAccountProvider import com.nextcloud.client.logger.Logger -import com.nextcloud.utils.TimeConstants +import com.nextcloud.utils.AppConstants import com.owncloud.android.datamodel.OCFile import com.owncloud.android.files.FileMenuFilter import com.owncloud.android.lib.resources.files.model.FileLockType @@ -132,7 +132,7 @@ class FileActionsViewModel @Inject constructor( private fun getLockedUntil(file: OCFile): Long? = if (file.lockTimestamp == 0L || file.lockTimeout == 0L) { null } else { - (file.lockTimestamp + file.lockTimeout) * TimeConstants.MILLIS_PER_SECOND + (file.lockTimestamp + file.lockTimeout) * AppConstants.MILLIS_PER_SECOND } fun onClick(action: FileAction) { diff --git a/app/src/main/java/com/nextcloud/utils/AppConstants.kt b/app/src/main/java/com/nextcloud/utils/AppConstants.kt new file mode 100644 index 000000000000..9c41f5239531 --- /dev/null +++ b/app/src/main/java/com/nextcloud/utils/AppConstants.kt @@ -0,0 +1,27 @@ +/* + * Nextcloud - Android Client + * + * SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2022 Álvaro Brey + * SPDX-FileCopyrightText: 2022 Nextcloud GmbH + * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only + */ +package com.nextcloud.utils + +import kotlin.time.Duration.Companion.seconds + +object AppConstants { + const val MILLIS_PER_SECOND = 1000 + const val SECONDS_PER_MINUTE = 60 + const val MINUTES_PER_HOUR = 60 + val ONE_SECOND = 1.seconds + + const val BYTES_PER_KB = 1024 + const val BYTES_PER_MB = BYTES_PER_KB * BYTES_PER_KB + + const val PROGRESS_PERCENTAGE_MIN = 0 + const val PROGRESS_PERCENTAGE_MAX = 100 + + const val DEFAULT_CONNECTION_TIMEOUT_MS = 5000 + const val DEFAULT_READ_TIMEOUT_MS = 40000 +} diff --git a/app/src/main/java/com/nextcloud/utils/BitmapExtensions.kt b/app/src/main/java/com/nextcloud/utils/BitmapExtensions.kt index 1a7c107021cd..834bdec67455 100644 --- a/app/src/main/java/com/nextcloud/utils/BitmapExtensions.kt +++ b/app/src/main/java/com/nextcloud/utils/BitmapExtensions.kt @@ -15,11 +15,11 @@ import androidx.exifinterface.media.ExifInterface import com.nextcloud.utils.extensions.toFile import com.owncloud.android.lib.common.utils.Log_OC import com.owncloud.android.utils.BitmapUtils.calculateSampleFactor +import com.nextcloud.utils.AppConstants.BYTES_PER_KB private const val TAG = "BitmapExtension" -@Suppress("MagicNumber") -fun Bitmap.allocationKilobyte(): Int = allocationByteCount.div(1024) +fun Bitmap.allocationKilobyte(): Int = allocationByteCount.div(BYTES_PER_KB) /** * Scales down the Bitmap step by step until its size allocation is within the specified size. diff --git a/app/src/main/java/com/nextcloud/utils/CalendarEventManager.kt b/app/src/main/java/com/nextcloud/utils/CalendarEventManager.kt index a609071d2609..e18d41b49356 100644 --- a/app/src/main/java/com/nextcloud/utils/CalendarEventManager.kt +++ b/app/src/main/java/com/nextcloud/utils/CalendarEventManager.kt @@ -18,6 +18,7 @@ import com.owncloud.android.R import com.owncloud.android.lib.common.SearchResultEntry import com.owncloud.android.ui.interfaces.UnifiedSearchListInterface import com.owncloud.android.utils.PermissionUtil.checkSelfPermission +import com.nextcloud.utils.AppConstants.MILLIS_PER_SECOND class CalendarEventManager(private val context: Context) { @@ -74,5 +75,4 @@ class CalendarEventManager(private val context: Context) { } } -@Suppress("MagicNumber") -private fun SearchResultEntry.createdAt(): Long? = attributes["createdAt"]?.toLongOrNull()?.times(1000L) +private fun SearchResultEntry.createdAt(): Long? = attributes["createdAt"]?.toLongOrNull()?.times(MILLIS_PER_SECOND) diff --git a/app/src/main/java/com/nextcloud/utils/TimeConstants.kt b/app/src/main/java/com/nextcloud/utils/TimeConstants.kt deleted file mode 100644 index 7c5797649190..000000000000 --- a/app/src/main/java/com/nextcloud/utils/TimeConstants.kt +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2022 Álvaro Brey - * SPDX-FileCopyrightText: 2022 Nextcloud GmbH - * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only - */ -package com.nextcloud.utils - -object TimeConstants { - const val MILLIS_PER_SECOND = 1000 -} diff --git a/app/src/main/java/com/nextcloud/utils/date/DateFormatter.kt b/app/src/main/java/com/nextcloud/utils/date/DateFormatter.kt index ea43a5a27bc0..3dc56d023539 100644 --- a/app/src/main/java/com/nextcloud/utils/date/DateFormatter.kt +++ b/app/src/main/java/com/nextcloud/utils/date/DateFormatter.kt @@ -10,6 +10,7 @@ package com.nextcloud.utils.date import android.icu.text.SimpleDateFormat import java.util.Date import java.util.Locale +import com.nextcloud.utils.AppConstants.MILLIS_PER_SECOND object DateFormatter { @@ -17,9 +18,8 @@ object DateFormatter { * Converts a Unix timestamp (in milliseconds) into a formatted date string. * For example, input 1733309160885 with "MMM d" pattern outputs "Dec 4". */ - @Suppress("MagicNumber") fun timestampToDateRepresentation(timestamp: Long, formatPattern: DateFormatPattern): String { - val date = Date(timestamp * 1000) + val date = Date(timestamp * MILLIS_PER_SECOND) val format = SimpleDateFormat(formatPattern.pattern, Locale.getDefault()) return format.format(date) } diff --git a/app/src/main/java/com/nextcloud/utils/extensions/Extensions.kt b/app/src/main/java/com/nextcloud/utils/extensions/Extensions.kt index 598bff9e0fc8..288d95fa62f6 100644 --- a/app/src/main/java/com/nextcloud/utils/extensions/Extensions.kt +++ b/app/src/main/java/com/nextcloud/utils/extensions/Extensions.kt @@ -25,8 +25,9 @@ import com.owncloud.android.lib.resources.trashbin.model.TrashbinFile import java.text.SimpleDateFormat import java.util.Date import java.util.Locale +import com.nextcloud.utils.AppConstants.ONE_SECOND -fun mainThread(delay: Long = 1000, action: () -> Unit) { +fun mainThread(delay: Long = ONE_SECOND.inWholeMilliseconds, action: () -> Unit) { Handler(Looper.getMainLooper()).postDelayed({ action() }, delay) diff --git a/app/src/main/java/com/nextcloud/utils/extensions/FileExtensions.kt b/app/src/main/java/com/nextcloud/utils/extensions/FileExtensions.kt index 3d6ed60ebc3e..8c6fddfdcb22 100644 --- a/app/src/main/java/com/nextcloud/utils/extensions/FileExtensions.kt +++ b/app/src/main/java/com/nextcloud/utils/extensions/FileExtensions.kt @@ -23,9 +23,9 @@ import java.io.IOException import java.nio.file.Files import java.nio.file.Path import java.nio.file.attribute.BasicFileAttributes +import com.nextcloud.utils.AppConstants.MILLIS_PER_SECOND private const val TAG = "FileExtensions" -private const val MS_IN_SECOND = 1000 fun OCFile?.logFileSize(tag: String) { val size = HumanReadableFormatter.formatBytes(this?.fileLength ?: -1) @@ -129,8 +129,8 @@ fun OCFile?.isTheSameAs(localFile: File?): Boolean = try { val remoteName = this.fileName val localSize = localFile.length() val remoteSize = this.fileLength - val localModified = attr.lastModifiedTime().toMillis() / MS_IN_SECOND // Unix time in milliseconds - val remoteModified = this.modificationTimestamp / MS_IN_SECOND // Unix time in milliseconds + val localModified = attr.lastModifiedTime().toMillis() / MILLIS_PER_SECOND // Unix time in milliseconds + val remoteModified = this.modificationTimestamp / MILLIS_PER_SECOND // Unix time in milliseconds remoteName == localName && remoteSize == localSize && remoteModified == localModified diff --git a/app/src/main/java/com/nextcloud/utils/extensions/OCCapabilityExtensions.kt b/app/src/main/java/com/nextcloud/utils/extensions/OCCapabilityExtensions.kt index 5bcbb4d676a6..2e7aa86bc4c8 100644 --- a/app/src/main/java/com/nextcloud/utils/extensions/OCCapabilityExtensions.kt +++ b/app/src/main/java/com/nextcloud/utils/extensions/OCCapabilityExtensions.kt @@ -12,11 +12,12 @@ import com.owncloud.android.lib.common.utils.Log_OC import com.owncloud.android.lib.resources.status.NextcloudVersion import com.owncloud.android.lib.resources.status.OCCapability import org.json.JSONException +import com.nextcloud.utils.AppConstants.BYTES_PER_KB private val gson = Gson() private const val TAG = "OCCapabilityExtensions" -private const val MAX_JSON_BYTES = 512 * 1024 +private const val MAX_JSON_BYTES = 512 * BYTES_PER_KB /** * Determines whether **Windows-compatible file (WCF)** restrictions should be applied diff --git a/app/src/main/java/com/nextcloud/utils/extensions/RemoteFileExtensions.kt b/app/src/main/java/com/nextcloud/utils/extensions/RemoteFileExtensions.kt index 0518325e92c8..ed7590991eb1 100644 --- a/app/src/main/java/com/nextcloud/utils/extensions/RemoteFileExtensions.kt +++ b/app/src/main/java/com/nextcloud/utils/extensions/RemoteFileExtensions.kt @@ -7,7 +7,7 @@ package com.nextcloud.utils.extensions -import com.nextcloud.utils.TimeConstants +import com.nextcloud.utils.AppConstants import com.owncloud.android.datamodel.OCFile import com.owncloud.android.lib.resources.files.model.RemoteFile import com.owncloud.android.lib.resources.shares.ShareeUser @@ -20,14 +20,14 @@ fun RemoteFile.isSame(path: String?): Boolean { val localFile = path?.toFile() ?: return false // remote file timestamp in millisecond not microsecond - val localLastModifiedTimestamp = localFile.lastModified() / TimeConstants.MILLIS_PER_SECOND + val localLastModifiedTimestamp = localFile.lastModified() / AppConstants.MILLIS_PER_SECOND val localCreationTimestamp = FileUtil.getCreationTimestamp(localFile) val localSize: Long = localFile.length() return size == localSize && localCreationTimestamp != null && localCreationTimestamp == creationTimestamp && - modifiedTimestamp == localLastModifiedTimestamp * TimeConstants.MILLIS_PER_SECOND && + modifiedTimestamp == localLastModifiedTimestamp * AppConstants.MILLIS_PER_SECOND && this.areImageDimensionsSame(path) } diff --git a/app/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java b/app/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java index da22ecb19e6f..04055f375549 100644 --- a/app/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java +++ b/app/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java @@ -46,6 +46,7 @@ import com.nextcloud.model.OfflineOperationRawType; import com.nextcloud.model.OfflineOperationType; import com.nextcloud.model.ShareeEntry; +import com.nextcloud.utils.AppConstants; import com.nextcloud.utils.date.DateFormatPattern; import com.nextcloud.utils.e2ee.E2EVersionHelper; import com.nextcloud.utils.extensions.DateExtensionsKt; @@ -193,7 +194,7 @@ public void addCreateFileOfflineOperation(String[] localPaths, String[] remotePa long modificationTimestamp = System.currentTimeMillis(); entity.setCreatedAt(createdAt); - entity.setModifiedAt(modificationTimestamp / 1000); + entity.setModifiedAt(modificationTimestamp / AppConstants.MILLIS_PER_SECOND); entity.setFilename(new File(remotePath).getName()); String parentPath = new File(remotePath).getParent() + OCFile.PATH_SEPARATOR; @@ -226,7 +227,7 @@ public OfflineOperationEntity addCreateFolderOfflineOperation(String path, Strin long modificationTimestamp = System.currentTimeMillis(); entity.setCreatedAt(createdAt); - entity.setModifiedAt(modificationTimestamp / 1000); + entity.setModifiedAt(modificationTimestamp / AppConstants.MILLIS_PER_SECOND); offlineOperationDao.insert(entity); createPendingDirectory(path, createdAt, modificationTimestamp); @@ -295,7 +296,7 @@ public void addRenameFileOfflineOperation(OCFile file, String newName) { long modificationTimestamp = System.currentTimeMillis(); entity.setCreatedAt(createdAt); - entity.setModifiedAt(modificationTimestamp / 1000); + entity.setModifiedAt(modificationTimestamp / AppConstants.MILLIS_PER_SECOND); offlineOperationDao.insert(entity); } @@ -338,7 +339,7 @@ public void addRemoveFileOfflineOperation(@NonNull OCFile file) { long modificationTimestamp = System.currentTimeMillis(); entity.setCreatedAt(createdAt); - entity.setModifiedAt(modificationTimestamp / 1000); + entity.setModifiedAt(modificationTimestamp / AppConstants.MILLIS_PER_SECOND); offlineOperationDao.insert(entity); } diff --git a/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java b/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java index c192d25860f8..dc9a5cbfad4c 100644 --- a/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java +++ b/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java @@ -32,6 +32,7 @@ import com.nextcloud.client.account.User; import com.nextcloud.client.network.ConnectivityService; +import com.nextcloud.utils.AppConstants; import com.nextcloud.utils.BitmapExtensionsKt; import com.nextcloud.utils.extensions.FileExtensionsKt; import com.nextcloud.utils.extensions.OCFileExtensionsKt; @@ -76,9 +77,7 @@ * Manager for concurrent access to thumbnails cache. */ public final class ThumbnailsCacheManager { - private static final int READ_TIMEOUT = 40000; private static final int[] VIDEO_PREVIEW_SIZES = {1024, 512, 256, 128, 64}; - private static final int CONNECTION_TIMEOUT = 5000; /** Cache key prefix {@code }; sized from {@link #getScreenDimension()}. */ public static final String PREFIX_RESIZED_IMAGE = "r"; @@ -98,7 +97,7 @@ public final class ThumbnailsCacheManager { private static volatile DiskLruImageCache mThumbnailCache; private static volatile boolean mThumbnailCacheStarting = true; - private static final int DISK_CACHE_SIZE = 1024 * 1024 * 200; // 200MB + private static final int DISK_CACHE_SIZE = 200 * AppConstants.BYTES_PER_MB; private static final CompressFormat mCompressFormat = CompressFormat.JPEG; private static final int mCompressQuality = 70; private static OwnCloudClient mClient; @@ -667,7 +666,9 @@ private Bitmap doThumbnailFromOCFileInBackground() { getMethod.setRequestHeader("Cookie", "nc_sameSiteCookielax=true;nc_sameSiteCookiestrict=true"); getMethod.setRequestHeader(RemoteOperation.OCS_API_HEADER, RemoteOperation.OCS_API_HEADER_VALUE); - int status = mClient.executeMethod(getMethod, READ_TIMEOUT, CONNECTION_TIMEOUT); + int status = mClient.executeMethod(getMethod, + AppConstants.DEFAULT_READ_TIMEOUT_MS, + AppConstants.DEFAULT_CONNECTION_TIMEOUT_MS); if (status == HttpStatus.SC_OK) { try (InputStream inputStream = getMethod.getResponseBodyAsStream()) { @@ -915,7 +916,7 @@ private static Bitmap downloadPreview(OCFile file, String uri) { try { getMethod = new GetMethod(uri); - getMethod.getParams().setSoTimeout(READ_TIMEOUT); + getMethod.getParams().setSoTimeout(AppConstants.DEFAULT_READ_TIMEOUT_MS); int status = mClient.executeMethod(getMethod); if (status != HttpStatus.SC_OK) { diff --git a/app/src/main/java/com/owncloud/android/files/CreateFileFromTemplateOperation.java b/app/src/main/java/com/owncloud/android/files/CreateFileFromTemplateOperation.java index 5e146a89ccd9..04193d58c089 100644 --- a/app/src/main/java/com/owncloud/android/files/CreateFileFromTemplateOperation.java +++ b/app/src/main/java/com/owncloud/android/files/CreateFileFromTemplateOperation.java @@ -7,6 +7,7 @@ */ package com.owncloud.android.files; +import com.nextcloud.utils.AppConstants; import com.owncloud.android.lib.common.OwnCloudClient; import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; @@ -20,8 +21,6 @@ public class CreateFileFromTemplateOperation extends RemoteOperation { private static final String TAG = CreateFileFromTemplateOperation.class.getSimpleName(); - private static final int SYNC_READ_TIMEOUT = 40000; - private static final int SYNC_CONNECTION_TIMEOUT = 5000; private static final String NEW_FROM_TEMPLATE_URL = "/ocs/v2.php/apps/richdocuments/api/v1/templates/new"; private String path; @@ -50,7 +49,9 @@ protected RemoteOperationResult run(OwnCloudClient client) { // remote request postMethod.addRequestHeader(OCS_API_HEADER, OCS_API_HEADER_VALUE); - int status = client.executeMethod(postMethod, SYNC_READ_TIMEOUT, SYNC_CONNECTION_TIMEOUT); + int status = client.executeMethod(postMethod, + AppConstants.DEFAULT_READ_TIMEOUT_MS, + AppConstants.DEFAULT_CONNECTION_TIMEOUT_MS); if (status == HttpStatus.SC_OK) { String response = postMethod.getResponseBodyAsString(); diff --git a/app/src/main/java/com/owncloud/android/files/FetchTemplateOperation.kt b/app/src/main/java/com/owncloud/android/files/FetchTemplateOperation.kt index 7c37b4d0576a..9fb6a29c9e70 100644 --- a/app/src/main/java/com/owncloud/android/files/FetchTemplateOperation.kt +++ b/app/src/main/java/com/owncloud/android/files/FetchTemplateOperation.kt @@ -15,6 +15,8 @@ import com.owncloud.android.ui.dialog.ChooseRichDocumentsTemplateDialogFragment import org.apache.commons.httpclient.HttpStatus import org.apache.commons.httpclient.methods.GetMethod import org.json.JSONObject +import com.nextcloud.utils.AppConstants.DEFAULT_CONNECTION_TIMEOUT_MS +import com.nextcloud.utils.AppConstants.DEFAULT_READ_TIMEOUT_MS class FetchTemplateOperation(private val type: ChooseRichDocumentsTemplateDialogFragment.Type) : RemoteOperation() { @@ -28,7 +30,7 @@ class FetchTemplateOperation(private val type: ChooseRichDocumentsTemplateDialog addRequestHeader(OCS_API_HEADER, OCS_API_HEADER_VALUE) } - val status = client.executeMethod(getMethod, SYNC_READ_TIMEOUT, SYNC_CONNECTION_TIMEOUT) + val status = client.executeMethod(getMethod, DEFAULT_READ_TIMEOUT_MS, DEFAULT_CONNECTION_TIMEOUT_MS) if (status != HttpStatus.SC_OK) { client.exhaustResponse(getMethod.responseBodyAsStream) return RemoteOperationResult(false, getMethod) @@ -65,8 +67,6 @@ class FetchTemplateOperation(private val type: ChooseRichDocumentsTemplateDialog companion object { private val TAG = FetchTemplateOperation::class.java.simpleName - private const val SYNC_READ_TIMEOUT = 40000 - private const val SYNC_CONNECTION_TIMEOUT = 5000 private const val TEMPLATE_URL = "/ocs/v2.php/apps/richdocuments/api/v1/templates/" private const val JSON_FORMAT = "?format=json" diff --git a/app/src/main/java/com/owncloud/android/operations/RemoveRemoteEncryptedFileOperation.kt b/app/src/main/java/com/owncloud/android/operations/RemoveRemoteEncryptedFileOperation.kt index 7f032bd3ae8c..c728df20f168 100644 --- a/app/src/main/java/com/owncloud/android/operations/RemoveRemoteEncryptedFileOperation.kt +++ b/app/src/main/java/com/owncloud/android/operations/RemoveRemoteEncryptedFileOperation.kt @@ -28,6 +28,7 @@ import com.owncloud.android.utils.theme.CapabilityUtils import org.apache.commons.httpclient.HttpStatus import org.apache.commons.httpclient.NameValuePair import org.apache.jackrabbit.webdav.client.methods.DeleteMethod +import com.nextcloud.utils.AppConstants.DEFAULT_CONNECTION_TIMEOUT_MS @Suppress("LongParameterList") class RemoveRemoteEncryptedFileOperation internal constructor( @@ -104,7 +105,7 @@ class RemoveRemoteEncryptedFileOperation internal constructor( setQueryString(arrayOf(NameValuePair(E2E_TOKEN, token))) } - val status = client.executeMethod(delete, REMOVE_READ_TIMEOUT, REMOVE_CONNECTION_TIMEOUT) + val status = client.executeMethod(delete, REMOVE_READ_TIMEOUT, DEFAULT_CONNECTION_TIMEOUT_MS) delete.getResponseBodyAsString() // exhaust the response, although not interesting val result = RemoteOperationResult(delete.succeeded() || status == HttpStatus.SC_NOT_FOUND, delete) @@ -207,6 +208,5 @@ class RemoveRemoteEncryptedFileOperation internal constructor( companion object { private val TAG = RemoveRemoteEncryptedFileOperation::class.java.getSimpleName() private const val REMOVE_READ_TIMEOUT = 30000 - private const val REMOVE_CONNECTION_TIMEOUT = 5000 } } diff --git a/app/src/main/java/com/owncloud/android/operations/RichDocumentsCreateAssetOperation.java b/app/src/main/java/com/owncloud/android/operations/RichDocumentsCreateAssetOperation.java index e593a20c043f..f0c941385d79 100644 --- a/app/src/main/java/com/owncloud/android/operations/RichDocumentsCreateAssetOperation.java +++ b/app/src/main/java/com/owncloud/android/operations/RichDocumentsCreateAssetOperation.java @@ -7,6 +7,7 @@ */ package com.owncloud.android.operations; +import com.nextcloud.utils.AppConstants; import com.owncloud.android.lib.common.OwnCloudClient; import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; @@ -22,8 +23,6 @@ public class RichDocumentsCreateAssetOperation extends RemoteOperation { private static final String TAG = RichDocumentsCreateAssetOperation.class.getSimpleName(); - private static final int SYNC_READ_TIMEOUT = 40000; - private static final int SYNC_CONNECTION_TIMEOUT = 5000; private static final String ASSET_URL = "/index.php/apps/richdocuments/assets"; private static final String NODE_URL = "url"; @@ -49,7 +48,9 @@ protected RemoteOperationResult run(OwnCloudClient client) { // remote request postMethod.addRequestHeader(OCS_API_HEADER, OCS_API_HEADER_VALUE); - int status = client.executeMethod(postMethod, SYNC_READ_TIMEOUT, SYNC_CONNECTION_TIMEOUT); + int status = client.executeMethod(postMethod, + AppConstants.DEFAULT_READ_TIMEOUT_MS, + AppConstants.DEFAULT_CONNECTION_TIMEOUT_MS); if (status == HttpStatus.SC_OK) { String response = postMethod.getResponseBodyAsString(); diff --git a/app/src/main/java/com/owncloud/android/operations/RichDocumentsUrlOperation.java b/app/src/main/java/com/owncloud/android/operations/RichDocumentsUrlOperation.java index a05a8925cc74..8edccb4fc8da 100644 --- a/app/src/main/java/com/owncloud/android/operations/RichDocumentsUrlOperation.java +++ b/app/src/main/java/com/owncloud/android/operations/RichDocumentsUrlOperation.java @@ -7,6 +7,7 @@ */ package com.owncloud.android.operations; +import com.nextcloud.utils.AppConstants; import com.owncloud.android.lib.common.OwnCloudClient; import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; @@ -27,8 +28,6 @@ public class RichDocumentsUrlOperation extends RemoteOperation { */ private static final String TAG = RichDocumentsUrlOperation.class.getSimpleName(); - private static final int SYNC_READ_TIMEOUT = 40000; - private static final int SYNC_CONNECTION_TIMEOUT = 5000; private static final String DOCUMENT_URL = "/ocs/v2.php/apps/richdocuments/api/v1/document"; private static final String FILE_ID = "fileId"; @@ -56,7 +55,9 @@ protected RemoteOperationResult run(OwnCloudClient client) { // remote request postMethod.addRequestHeader(OCS_API_HEADER, OCS_API_HEADER_VALUE); - int status = client.executeMethod(postMethod, SYNC_READ_TIMEOUT, SYNC_CONNECTION_TIMEOUT); + int status = client.executeMethod(postMethod, + AppConstants.DEFAULT_READ_TIMEOUT_MS, + AppConstants.DEFAULT_CONNECTION_TIMEOUT_MS); if (status == HttpStatus.SC_OK) { String response = postMethod.getResponseBodyAsString(); diff --git a/app/src/main/java/com/owncloud/android/operations/UploadFileOperation.java b/app/src/main/java/com/owncloud/android/operations/UploadFileOperation.java index 71fd64a76c1c..0c74b94c9968 100644 --- a/app/src/main/java/com/owncloud/android/operations/UploadFileOperation.java +++ b/app/src/main/java/com/owncloud/android/operations/UploadFileOperation.java @@ -24,6 +24,7 @@ import com.nextcloud.client.jobs.upload.FileUploadWorker; import com.nextcloud.client.network.Connectivity; import com.nextcloud.client.network.ConnectivityService; +import com.nextcloud.utils.AppConstants; import com.nextcloud.utils.autoRename.AutoRename; import com.nextcloud.utils.e2ee.E2ECounterHelper; import com.nextcloud.utils.e2ee.E2EVersionHelper; @@ -580,7 +581,7 @@ private RemoteOperationResult encryptedUpload(OwnCloudClient client, OCFile pare return result; } - long lastModifiedTimestamp = e2eFiles.getOriginalFile().lastModified() / 1000; + long lastModifiedTimestamp = e2eFiles.getOriginalFile().lastModified() / AppConstants.MILLIS_PER_SECOND; Long creationTimestamp = FileUtil.getCreationTimestamp(e2eFiles.getOriginalFile()); if (creationTimestamp == null) { Log_OC.e(TAG, "UploadFileOperation creationTimestamp cannot be null"); @@ -1059,7 +1060,7 @@ private RemoteOperationResult normalUpload(OwnCloudClient client) { } // Get the last modification date of the file from the file system - long lastModifiedTimestamp = originalFile.lastModified() / 1000; + long lastModifiedTimestamp = originalFile.lastModified() / AppConstants.MILLIS_PER_SECOND; final Long creationTimestamp = FileUtil.getCreationTimestamp(originalFile); Path filePath = Paths.get(mFile.getStoragePath()); diff --git a/app/src/main/java/com/owncloud/android/operations/upload/DeleteUploadedFileOperation.kt b/app/src/main/java/com/owncloud/android/operations/upload/DeleteUploadedFileOperation.kt index 6e42ae8320b8..1ebc1de8f6ce 100644 --- a/app/src/main/java/com/owncloud/android/operations/upload/DeleteUploadedFileOperation.kt +++ b/app/src/main/java/com/owncloud/android/operations/upload/DeleteUploadedFileOperation.kt @@ -19,6 +19,7 @@ import com.owncloud.android.utils.SyncedFolderUtils import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import java.io.File +import com.nextcloud.utils.AppConstants.MILLIS_PER_SECOND class DeleteUploadedFileOperation( private val syncedFolder: SyncedFolder, @@ -28,8 +29,6 @@ class DeleteUploadedFileOperation( companion object { const val TAG = "DeleteUploadedFileOperation" - - const val MS_IN_SECOND = 1000 } private val syncFolderHelper = SyncFolderHelper(context) @@ -131,7 +130,7 @@ class DeleteUploadedFileOperation( // Check the file has same mod date. Note that the remote mod date is rounded to the second. val remoteLastMod = ocFile.modificationTimestamp - if (remoteLastMod / MS_IN_SECOND != localLastMod / MS_IN_SECOND) { + if (remoteLastMod / MILLIS_PER_SECOND != localLastMod / MILLIS_PER_SECOND) { Log_OC.i( TAG, "Local and remote mod date differs for file ${localFile.name}: " + diff --git a/app/src/main/java/com/owncloud/android/providers/DocumentsStorageProvider.java b/app/src/main/java/com/owncloud/android/providers/DocumentsStorageProvider.java index 8aacf15a18b3..113646322ffd 100644 --- a/app/src/main/java/com/owncloud/android/providers/DocumentsStorageProvider.java +++ b/app/src/main/java/com/owncloud/android/providers/DocumentsStorageProvider.java @@ -34,6 +34,7 @@ import com.nextcloud.client.preferences.AppPreferences; import com.nextcloud.client.preferences.AppPreferencesImpl; import com.nextcloud.client.utils.HashUtil; +import com.nextcloud.utils.AppConstants; import com.nextcloud.utils.extensions.ContextExtensionsKt; import com.nextcloud.utils.extensions.FileExtensionsKt; import com.nextcloud.utils.fileNameValidator.FileNameValidator; @@ -681,11 +682,12 @@ private String createFile(Document targetFolder, String displayName, String mime try { // perform the upload, no need for chunked operation as we have a empty file OwnCloudClient client = targetFolder.getClient(); + final long nowSeconds = System.currentTimeMillis() / AppConstants.MILLIS_PER_SECOND; final var result = new UploadFileRemoteOperation(emptyFile.getAbsolutePath(), newFilePath, mimeType, "", - System.currentTimeMillis() / 1000, + nowSeconds, FileUtil.getCreationTimestamp(emptyFile), false) .execute(client); diff --git a/app/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java b/app/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java index 5a8b609465d4..6de1d17bb31f 100644 --- a/app/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java +++ b/app/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java @@ -26,6 +26,7 @@ import android.os.Bundle; import com.nextcloud.client.account.UserAccountManager; +import com.nextcloud.utils.AppConstants; import com.owncloud.android.R; import com.owncloud.android.authentication.AuthenticatorActivity; import com.owncloud.android.datamodel.FileDataStorageManager; @@ -48,6 +49,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.TimeUnit; import androidx.annotation.PluralsRes; import androidx.core.app.NotificationCompat; @@ -156,7 +158,9 @@ public synchronized void onPerformSync(Account account, Bundle extras, mForgottenLocalFiles = new HashMap<>(); mSyncResult = syncResult; mSyncResult.fullSyncRequested = false; - mSyncResult.delayUntil = (System.currentTimeMillis()/1000) + 3*60*60; // avoid too many automatic synchronizations + // avoid too many automatic synchronizations + mSyncResult.delayUntil = System.currentTimeMillis() / AppConstants.MILLIS_PER_SECOND + + TimeUnit.HOURS.toSeconds(3); this.setAccount(account); this.setContentProviderClient(providerClient); diff --git a/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.kt b/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.kt index c8ece71bd03c..a5043cb401b5 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.kt @@ -40,6 +40,7 @@ import com.owncloud.android.utils.WebViewUtil import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlin.time.Duration.Companion.seconds +import com.nextcloud.utils.AppConstants.ONE_SECOND abstract class EditorWebView : ExternalSiteWebView() { private lateinit var binding: RichdocumentsWebviewBinding @@ -84,7 +85,7 @@ abstract class EditorWebView : ExternalSiteWebView() { lifecycleScope.launch { WebViewUtil().setProxyKKPlus(webView) - delay(PROXY_SETUP_DELAY) + delay(ONE_SECOND) if (loadedUrl != webView.url) { webView.loadUrl(loadedUrl) @@ -272,7 +273,6 @@ abstract class EditorWebView : ExternalSiteWebView() { companion object { private const val IMAGE_MIME_TYPE_FILTER = "image/*" - private val PROXY_SETUP_DELAY = 1.seconds private val LOADING_TIMEOUT = 10.seconds } } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.kt index 2618b3d63dda..63a7c1254b1a 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.kt @@ -37,6 +37,7 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.launch import javax.inject.Inject import androidx.activity.OnBackPressedCallback +import com.nextcloud.utils.AppConstants.ONE_SECOND @Suppress("TooManyFunctions", "MagicNumber") class PassCodeActivity : @@ -46,7 +47,6 @@ class PassCodeActivity : companion object { private val TAG = PassCodeActivity::class.java.simpleName - private const val ONE_SECOND_MS = 1000L private const val KEY_PASSCODE_DIGITS = "PASSCODE_DIGITS" private const val KEY_CONFIRMING_PASSCODE = "CONFIRMING_PASSCODE" const val ACTION_REQUEST_WITH_RESULT = "ACTION_REQUEST_WITH_RESULT" @@ -384,7 +384,7 @@ class PassCodeActivity : lifecycleScope.launch(Dispatchers.Main) { while (counter != 0) { binding.explanation.text = delayFormatter.getExplanationText(counter) - delay(ONE_SECOND_MS) + delay(ONE_SECOND) counter -= 1 } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/PassCodeDelayFormatter.kt b/app/src/main/java/com/owncloud/android/ui/activity/PassCodeDelayFormatter.kt index 6e65e7e97cd7..9e88726fd3ec 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/PassCodeDelayFormatter.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/PassCodeDelayFormatter.kt @@ -8,6 +8,7 @@ package com.owncloud.android.ui.activity import android.content.res.Resources import com.owncloud.android.R +import com.nextcloud.utils.AppConstants.SECONDS_PER_MINUTE class PassCodeDelayFormatter(private val resources: Resources) { @@ -36,8 +37,4 @@ class PassCodeDelayFormatter(private val resources: Resources) { ) } } - - companion object { - const val SECONDS_PER_MINUTE = 60 - } } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/StorageMigration.java b/app/src/main/java/com/owncloud/android/ui/activity/StorageMigration.java index 02a1fb67b4d8..cf921b26cbb2 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/StorageMigration.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/StorageMigration.java @@ -20,6 +20,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder; import com.nextcloud.client.account.User; +import com.nextcloud.utils.AppConstants; import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.datamodel.FileDataStorageManager; @@ -272,7 +273,7 @@ protected void waitForUnfinishedSynchronizations() { for (Account ocAccount : mOcAccounts) { while (ContentResolver.isSyncActive(ocAccount, mAuthority)) { try { - Thread.sleep(1000); + Thread.sleep(AppConstants.MILLIS_PER_SECOND); } catch (InterruptedException e) { Log_OC.w(TAG, "Thread interrupted while waiting for account to end syncing"); Thread.currentThread().interrupt(); diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/DiskLruImageCache.kt b/app/src/main/java/com/owncloud/android/ui/adapter/DiskLruImageCache.kt index f9f1ab711c64..04e7c34026bd 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/DiskLruImageCache.kt +++ b/app/src/main/java/com/owncloud/android/ui/adapter/DiskLruImageCache.kt @@ -17,6 +17,7 @@ import java.io.BufferedOutputStream import java.io.File import java.io.IOException import java.io.InputStream +import com.nextcloud.utils.AppConstants.BYTES_PER_KB class DiskLruImageCache @Throws(IOException::class) @@ -133,9 +134,8 @@ constructor( private const val CACHE_VERSION = 1 private const val VALUE_COUNT = 1 private const val VALUE_INDEX = 0 - private const val IO_BUFFER_SIZE = 8 * 1024 + private const val IO_BUFFER_SIZE = 8 * BYTES_PER_KB private const val ARGB_8888_BYTES_PER_PIXEL = 4 - private const val BYTES_PER_KB = 1024 private val TAG = DiskLruImageCache::class.java.simpleName } diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/OCShareToOCFileConverter.kt b/app/src/main/java/com/owncloud/android/ui/adapter/OCShareToOCFileConverter.kt index 1a7876ec41d8..53bedc691394 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/OCShareToOCFileConverter.kt +++ b/app/src/main/java/com/owncloud/android/ui/adapter/OCShareToOCFileConverter.kt @@ -20,9 +20,9 @@ import com.owncloud.android.utils.FileStorageUtils import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import java.io.File +import com.nextcloud.utils.AppConstants.MILLIS_PER_SECOND object OCShareToOCFileConverter { - private const val MILLIS_PER_SECOND = 1000 private val LINK_SHARE_TYPES = setOf(ShareType.PUBLIC_LINK, ShareType.EMAIL) /** diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/PredefinedStatusViewHolder.kt b/app/src/main/java/com/owncloud/android/ui/adapter/PredefinedStatusViewHolder.kt index bce570f8ec7a..9eb41352c210 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/PredefinedStatusViewHolder.kt +++ b/app/src/main/java/com/owncloud/android/ui/adapter/PredefinedStatusViewHolder.kt @@ -13,8 +13,7 @@ import com.nextcloud.utils.text.DisplayTextFormatter import com.owncloud.android.R import com.owncloud.android.databinding.PredefinedStatusBinding import com.owncloud.android.lib.resources.users.PredefinedStatus - -private const val ONE_SECOND_IN_MILLIS = 1000 +import com.nextcloud.utils.AppConstants.MILLIS_PER_SECOND class PredefinedStatusViewHolder(private val binding: PredefinedStatusBinding) : RecyclerView.ViewHolder(binding.root) { @@ -30,7 +29,7 @@ class PredefinedStatusViewHolder(private val binding: PredefinedStatusBinding) : if (clearAt.type.equals("period")) { binding.clearAt.text = DisplayTextFormatter.formatRelativeTimestamp( context, - System.currentTimeMillis() + clearAt.time.toInt() * ONE_SECOND_IN_MILLIS, + System.currentTimeMillis() + clearAt.time.toInt() * MILLIS_PER_SECOND, true ) } else { diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/TrashbinListAdapter.java b/app/src/main/java/com/owncloud/android/ui/adapter/TrashbinListAdapter.java index 43bd3ed44eeb..601ba3a207b2 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/TrashbinListAdapter.java +++ b/app/src/main/java/com/owncloud/android/ui/adapter/TrashbinListAdapter.java @@ -20,6 +20,7 @@ import com.nextcloud.android.common.ui.theme.utils.ColorRole; import com.nextcloud.client.account.User; import com.nextcloud.client.preferences.AppPreferences; +import com.nextcloud.utils.AppConstants; import com.nextcloud.utils.HumanReadableFormatter; import com.nextcloud.utils.extensions.FileExtensionsKt; import com.nextcloud.utils.extensions.ViewExtensionsKt; @@ -151,8 +152,9 @@ public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int positi trashbinFileViewHolder.binding.originalLocation.setText(location); // deletion time + long deletionTimestampMillis = file.getDeletionTimestamp() * AppConstants.MILLIS_PER_SECOND; trashbinFileViewHolder.binding.deletionTimestamp.setText( - DisplayTextFormatter.formatRelativeTimestamp(context, file.getDeletionTimestamp() * 1000)); + DisplayTextFormatter.formatRelativeTimestamp(context, deletionTimestampMillis)); // checkbox if (isCheckedFile(file)) { diff --git a/app/src/main/java/com/owncloud/android/ui/asynctasks/GallerySearchTask.kt b/app/src/main/java/com/owncloud/android/ui/asynctasks/GallerySearchTask.kt index 0c90fb707e5b..84806a21353b 100644 --- a/app/src/main/java/com/owncloud/android/ui/asynctasks/GallerySearchTask.kt +++ b/app/src/main/java/com/owncloud/android/ui/asynctasks/GallerySearchTask.kt @@ -26,6 +26,7 @@ import kotlinx.coroutines.withContext import java.text.SimpleDateFormat import java.util.Date import java.util.Locale +import com.nextcloud.utils.AppConstants.MILLIS_PER_SECOND class GallerySearchTask( private val fragment: GalleryFragment, @@ -37,7 +38,6 @@ class GallerySearchTask( companion object { private const val NO_TIMESTAMP = -1L private const val DATE_FORMAT = "yyyy-MM-dd HH:mm:ss" - private const val MILLIS_PER_SECOND = 1000L } fun execute(): Job = fragment.lifecycleScope.launch(Dispatchers.IO) { diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/ExpirationDatePickerDialogFragment.kt b/app/src/main/java/com/owncloud/android/ui/dialog/ExpirationDatePickerDialogFragment.kt index 261b3a9515a5..d83c4b0edb90 100644 --- a/app/src/main/java/com/owncloud/android/ui/dialog/ExpirationDatePickerDialogFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/dialog/ExpirationDatePickerDialogFragment.kt @@ -26,6 +26,7 @@ import com.owncloud.android.R import com.owncloud.android.utils.theme.ViewThemeUtils import java.util.Calendar import javax.inject.Inject +import com.nextcloud.utils.AppConstants.ONE_SECOND /** * Dialog requesting a date after today. @@ -103,7 +104,7 @@ class ExpirationDatePickerDialogFragment : // Prevent days in the past may be chosen val picker = dialog.datePicker - picker.minDate = tomorrowInMillis - 1000 + picker.minDate = tomorrowInMillis - ONE_SECOND.inWholeMilliseconds // Enforce spinners view; ignored by MD-based theme in Android >=5, but calendar is REALLY buggy // in Android < 5, so let's be sure it never appears (in tablets both spinners and calendar are diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/conflict/ConflictResolveDialogFactory.kt b/app/src/main/java/com/owncloud/android/ui/dialog/conflict/ConflictResolveDialogFactory.kt index 16a6d436b306..5235ed3080f7 100644 --- a/app/src/main/java/com/owncloud/android/ui/dialog/conflict/ConflictResolveDialogFactory.kt +++ b/app/src/main/java/com/owncloud/android/ui/dialog/conflict/ConflictResolveDialogFactory.kt @@ -22,10 +22,9 @@ import com.owncloud.android.ui.dialog.conflict.model.ConflictDialogData import com.owncloud.android.ui.dialog.conflict.model.ConflictDialogType import com.owncloud.android.ui.dialog.conflict.model.ConflictFileData import java.io.File +import com.nextcloud.utils.AppConstants.MILLIS_PER_SECOND object ConflictResolveDialogFactory { - private const val SECONDS_TO_MILLIS = 1000L - fun forOffline( context: Context, leftFile: OfflineOperationEntity, @@ -60,7 +59,7 @@ object ConflictResolveDialogFactory { titleId = R.string.conflict_local_file, timestamp = ( offlineCreatedLocalFile?.lastModified() - ?: leftFile.createdAt?.times(SECONDS_TO_MILLIS) ?: 0L + ?: leftFile.createdAt?.times(MILLIS_PER_SECOND) ?: 0L ), fileLength = (offlineCreatedLocalFile?.length() ?: 0L) ), diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.kt index 9676cd66aed4..b7f9be66a458 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.kt @@ -62,6 +62,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import com.nextcloud.utils.AppConstants.MILLIS_PER_SECOND @Suppress("ForbiddenComment", "ReturnCount", "MagicNumber", "MaxLineLength", "TooManyFunctions") class GalleryFragment : @@ -296,7 +297,7 @@ class GalleryFragment : return } - endDate = System.currentTimeMillis() / 1000 + endDate = System.currentTimeMillis() / MILLIS_PER_SECOND runGallerySearchTask() } @@ -363,7 +364,7 @@ class GalleryFragment : loadedItemCount = INITIAL_GALLERY_WINDOW restoreScrollPending = false clearSavedViewState() - endDate = System.currentTimeMillis() / 1000 + endDate = System.currentTimeMillis() / MILLIS_PER_SECOND runGallerySearchTask() } @@ -405,7 +406,7 @@ class GalleryFragment : } val lastFile = adapter?.getItem(lastVisibleItem - 1) ?: return - val lastItemTimestamp = lastFile.modificationTimestamp / 1000 + val lastItemTimestamp = lastFile.modificationTimestamp / MILLIS_PER_SECOND // if we have already older media in the gallery then retrieve file in chronological order to fill the gap if (lastItemTimestamp < this.endDate) { diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java index cb38a8f7d60d..fb7c402ac904 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -55,6 +55,7 @@ import com.nextcloud.ui.fileactions.FileAction; import com.nextcloud.ui.fileactions.FileActionsBottomSheet; import com.nextcloud.ui.sort.SortOrderUi; +import com.nextcloud.utils.AppConstants; import com.nextcloud.utils.EditorUtils; import com.nextcloud.utils.ShortcutUtil; import com.nextcloud.utils.SnackbarUtil; @@ -130,6 +131,7 @@ import java.util.List; import java.util.Objects; import java.util.Set; +import java.util.concurrent.TimeUnit; import javax.inject.Inject; @@ -1903,8 +1905,8 @@ private RemoteOperation getRecentFilesSearchRemoteOperation() { capability ); - long nowSeconds = System.currentTimeMillis() / 1000L; - long last14DaysTimestamp = nowSeconds - 14L * 24 * 60 * 60; + long nowSeconds = System.currentTimeMillis() / AppConstants.MILLIS_PER_SECOND; + long last14DaysTimestamp = nowSeconds - TimeUnit.DAYS.toSeconds(14); remoteOperation.setStartDate(last14DaysTimestamp); remoteOperation.setEndDate(nowSeconds); diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/uploadList/UploadListFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/uploadList/UploadListFragment.kt index b94de86606ce..e64e27eaaff0 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/uploadList/UploadListFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/uploadList/UploadListFragment.kt @@ -50,6 +50,7 @@ import com.owncloud.android.ui.navigation.NavigatorActivity import com.owncloud.android.utils.FilesSyncHelper import com.owncloud.android.utils.theme.ViewThemeUtils import javax.inject.Inject +import com.nextcloud.utils.AppConstants.ONE_SECOND @Suppress("TooManyFunctions") class UploadListFragment : @@ -105,7 +106,7 @@ class UploadListFragment : // region Lifecycle override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - throttler.intervalMillis = THROTTLE_INTERVAL_MILLIS + throttler.intervalMillis = ONE_SECOND.inWholeMilliseconds if (savedInstanceState == null) { setUserFromIntent() } @@ -289,7 +290,6 @@ class UploadListFragment : // endregion companion object { - private const val THROTTLE_INTERVAL_MILLIS = 1000L private const val SPAN_COUNT = 1 private const val EMPTY_LIST_ICON_ALPHA = 0.5f private const val UPDATE_UPLOAD_LIST_KEY = "update_upload_list" diff --git a/app/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java b/app/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java index 74284f878558..f0598060e40a 100755 --- a/app/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java +++ b/app/src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java @@ -36,6 +36,7 @@ import com.nextcloud.client.jobs.upload.FileUploadHelper; import com.nextcloud.client.jobs.upload.FileUploadWorker; import com.nextcloud.client.network.ConnectivityService; +import com.nextcloud.utils.AppConstants; import com.nextcloud.utils.EditorUtils; import com.nextcloud.utils.SnackbarUtil; import com.nextcloud.utils.extensions.OCFileExtensionsKt; @@ -93,6 +94,7 @@ import java.util.Locale; import java.util.Optional; import java.util.Set; +import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -193,7 +195,8 @@ public void startSyncForFileAndIntent(OCFile file, Intent intent) { // check if latest sync is >30s ago OCFile parent = storageManager.getFileById(file.getParentId()); - if (parent != null && parent.getLastSyncDateForData() + 30 * 1000 > System.currentTimeMillis()) { + if (parent != null && + parent.getLastSyncDateForData() + TimeUnit.SECONDS.toMillis(30) > System.currentTimeMillis()) { EventBus.getDefault().post(new SyncEventFinished(intent)); return; @@ -342,7 +345,7 @@ public void openFile(OCFile file) { // Sleep to show snackbar message try { - Thread.sleep(1000); + Thread.sleep(AppConstants.MILLIS_PER_SECOND); } catch (InterruptedException e) { Log_OC.e(TAG, "Failed to sleep"); } diff --git a/app/src/main/java/com/owncloud/android/utils/EncryptionUtils.java b/app/src/main/java/com/owncloud/android/utils/EncryptionUtils.java index 6c671410ecf2..c5b8923b5a72 100644 --- a/app/src/main/java/com/owncloud/android/utils/EncryptionUtils.java +++ b/app/src/main/java/com/owncloud/android/utils/EncryptionUtils.java @@ -18,6 +18,7 @@ import com.google.gson.reflect.TypeToken; import com.nextcloud.client.account.User; import com.nextcloud.common.SessionTimeOutKt; +import com.nextcloud.utils.AppConstants; import com.nextcloud.utils.e2ee.E2EVersionHelper; import com.owncloud.android.R; import com.owncloud.android.datamodel.ArbitraryDataProvider; @@ -1494,7 +1495,7 @@ public static void reportE2eError(ArbitraryDataProvider arbitraryDataProvider, U arbitraryDataProvider.storeOrUpdateKeyValue( user.getAccountName(), ArbitraryDataProvider.E2E_ERRORS_TIMESTAMP, - System.currentTimeMillis() / 1000 + System.currentTimeMillis() / AppConstants.MILLIS_PER_SECOND ); } } diff --git a/app/src/main/java/com/owncloud/android/utils/FileStorageUtils.kt b/app/src/main/java/com/owncloud/android/utils/FileStorageUtils.kt index b5e631c19fb0..ecc40735b9fc 100644 --- a/app/src/main/java/com/owncloud/android/utils/FileStorageUtils.kt +++ b/app/src/main/java/com/owncloud/android/utils/FileStorageUtils.kt @@ -44,6 +44,7 @@ import java.text.SimpleDateFormat import java.util.Date import java.util.Locale import java.util.TimeZone +import com.nextcloud.utils.AppConstants.ONE_SECOND @Suppress("TooManyFunctions") object FileStorageUtils { @@ -64,7 +65,6 @@ object FileStorageUtils { private const val ENV_SECONDARY_STORAGE = "SECONDARY_STORAGE" private const val ENV_EMULATED_STORAGE_TARGET = "EMULATED_STORAGE_TARGET" - private const val FILE_SAVE_POLL_INTERVAL_MS = 1000L private const val UNKNOWN_AVAILABLE_SPACE = -1L private const val FIRST_PRINTABLE_CHAR = ' ' @@ -375,7 +375,7 @@ object FileStorageUtils { lastModified = realFile.lastModified() lastSize = realFile.length() try { - Thread.sleep(FILE_SAVE_POLL_INTERVAL_MS) + Thread.sleep(ONE_SECOND.inWholeMilliseconds) } catch (_: InterruptedException) { Log_OC.d(TAG, "Interrupted while waiting for file to finish saving") Thread.currentThread().interrupt()