@@ -9,8 +9,6 @@ package com.nextcloud.client.jobs.autoUpload
99
1010import android.app.Notification
1111import android.content.Context
12- import android.content.res.Resources
13- import androidx.exifinterface.media.ExifInterface
1412import androidx.localbroadcastmanager.content.LocalBroadcastManager
1513import androidx.work.CoroutineWorker
1614import androidx.work.ForegroundInfo
@@ -25,13 +23,11 @@ import com.nextcloud.client.jobs.upload.FileUploadBroadcastManager
2523import com.nextcloud.client.jobs.upload.FileUploadWorker
2624import com.nextcloud.client.jobs.utils.UploadErrorNotificationManager
2725import com.nextcloud.client.network.ConnectivityService
28- import com.nextcloud.client.preferences.SubFolderRule
2926import com.nextcloud.utils.extensions.isNonRetryable
3027import com.nextcloud.utils.extensions.updateStatus
3128import com.owncloud.android.R
3229import com.owncloud.android.datamodel.ArbitraryDataProviderImpl
3330import com.owncloud.android.datamodel.FileDataStorageManager
34- import com.owncloud.android.datamodel.MediaFolderType
3531import com.owncloud.android.datamodel.SyncedFolder
3632import com.owncloud.android.datamodel.SyncedFolderProvider
3733import com.owncloud.android.datamodel.UploadsStorageManager
@@ -44,16 +40,10 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult
4440import com.owncloud.android.lib.common.utils.Log_OC
4541import com.owncloud.android.operations.UploadFileOperation
4642import com.owncloud.android.ui.activity.SettingsActivity
47- import com.owncloud.android.utils.FileStorageUtils
48- import com.owncloud.android.utils.MimeType
4943import com.owncloud.android.utils.theme.ViewThemeUtils
5044import kotlinx.coroutines.Dispatchers
5145import kotlinx.coroutines.withContext
5246import java.io.File
53- import java.text.ParsePosition
54- import java.text.SimpleDateFormat
55- import java.util.Locale
56- import java.util.TimeZone
5747
5848@Suppress(" LongParameterList" , " TooManyFunctions" , " TooGenericExceptionCaught" )
5949class AutoUploadWorker (
@@ -79,6 +69,7 @@ class AutoUploadWorker(
7969 }
8070
8171 private val helper = AutoUploadHelper ()
72+ private val syncFolderHelper = SyncFolderHelper (context)
8273 private val fileUploadBroadcastManager = FileUploadBroadcastManager (localBroadcastManager)
8374 private lateinit var syncedFolder: SyncedFolder
8475 private val notificationManager = AutoUploadNotificationManager (context, viewThemeUtils, NOTIFICATION_ID )
@@ -102,7 +93,11 @@ class AutoUploadWorker(
10293 collectFileChangesFromContentObserverWork(contentUris)
10394 uploadFiles(syncedFolder)
10495
105- Log_OC .d(TAG , " ✅ ${syncedFolder.remotePath} finished checking files." )
96+ // only update last scan time after uploading files
97+ syncedFolder.lastScanTimestampMs = System .currentTimeMillis()
98+ syncedFolderProvider.updateSyncFolder(syncedFolder)
99+
100+ Log_OC .d(TAG , " ✅ ${syncedFolder.remotePath} completed" )
106101 Result .success()
107102 } catch (e: Exception ) {
108103 Log_OC .e(TAG , " ❌ failed: ${e.message} " )
@@ -226,20 +221,11 @@ class AutoUploadWorker(
226221 helper.insertEntries(syncedFolder, repository)
227222 }
228223 }
229- syncedFolder.lastScanTimestampMs = System .currentTimeMillis()
230- syncedFolderProvider.updateSyncFolder(syncedFolder)
231224 }
232225 } catch (e: Exception ) {
233226 Log_OC .d(TAG , " Exception collectFileChangesFromContentObserverWork: $e " )
234227 }
235228
236- private fun prepareDateFormat (): SimpleDateFormat {
237- val currentLocale = context.resources.configuration.locales[0 ]
238- return SimpleDateFormat (" yyyy:MM:dd HH:mm:ss" , currentLocale).apply {
239- timeZone = TimeZone .getTimeZone(TimeZone .getDefault().id)
240- }
241- }
242-
243229 private fun getUserOrReturn (syncedFolder : SyncedFolder ): User ? {
244230 val optionalUser = userAccountManager.getUser(syncedFolder.account)
245231 if (! optionalUser.isPresent) {
@@ -274,13 +260,10 @@ class AutoUploadWorker(
274260
275261 @Suppress(" LongMethod" , " DEPRECATION" , " TooGenericExceptionCaught" )
276262 private suspend fun uploadFiles (syncedFolder : SyncedFolder ) = withContext(Dispatchers .IO ) {
277- val dateFormat = prepareDateFormat()
278263 val user = getUserOrReturn(syncedFolder) ? : return @withContext
279264 val ocAccount = OwnCloudAccount (user.toPlatformAccount(), context)
280265 val client = OwnCloudClientManagerFactory .getDefaultSingleton()
281266 .getClientFor(ocAccount, context)
282- val lightVersion = context.resources.getBoolean(R .bool.syncedFolder_light)
283- val currentLocale = context.resources.configuration.locales[0 ]
284267
285268 trySetForeground()
286269 updateNotification()
@@ -299,14 +282,7 @@ class AutoUploadWorker(
299282 filePathsWithIds.forEachIndexed { batchIndex, (path, id) ->
300283 val file = File (path)
301284 val localPath = file.absolutePath
302- val remotePath = getRemotePath(
303- file,
304- syncedFolder,
305- dateFormat,
306- lightVersion,
307- context.resources,
308- currentLocale
309- )
285+ val remotePath = syncFolderHelper.getAutoUploadRemotePath(syncedFolder, file)
310286
311287 try {
312288 val entityResult = getEntityResult(user, localPath, remotePath)
@@ -337,7 +313,6 @@ class AutoUploadWorker(
337313
338314 val result = operation.execute(client)
339315 fileUploadBroadcastManager.sendStarted(operation, context)
340- uploadsStorageManager.updateStatus(uploadEntity, result.isSuccess)
341316
342317 UploadErrorNotificationManager .handleResult(
343318 context,
@@ -471,79 +446,6 @@ class AutoUploadWorker(
471446 FileDataStorageManager (user, context.contentResolver)
472447 )
473448
474- private fun getRemotePath (
475- file : File ,
476- syncedFolder : SyncedFolder ,
477- sFormatter : SimpleDateFormat ,
478- lightVersion : Boolean ,
479- resources : Resources ,
480- currentLocale : Locale
481- ): String {
482- val lastModificationTime = calculateLastModificationTime(file, syncedFolder, sFormatter)
483-
484- val (remoteFolder, useSubfolders, subFolderRule) = if (lightVersion) {
485- Triple (
486- resources.getString(R .string.syncedFolder_remote_folder),
487- resources.getBoolean(R .bool.syncedFolder_light_use_subfolders),
488- SubFolderRule .YEAR_MONTH
489- )
490- } else {
491- Triple (
492- syncedFolder.remotePath,
493- syncedFolder.isSubfolderByDate,
494- syncedFolder.subfolderRule
495- )
496- }
497-
498- return FileStorageUtils .getInstantUploadFilePath(
499- file,
500- currentLocale,
501- remoteFolder,
502- syncedFolder.localPath,
503- lastModificationTime,
504- useSubfolders,
505- subFolderRule
506- )
507- }
508-
509- private fun hasExif (file : File ): Boolean {
510- val mimeType = FileStorageUtils .getMimeTypeFromName(file.absolutePath)
511- return MimeType .JPEG .equals(mimeType, ignoreCase = true ) || MimeType .TIFF .equals(mimeType, ignoreCase = true )
512- }
513-
514- @Suppress(" NestedBlockDepth" )
515- private fun calculateLastModificationTime (
516- file : File ,
517- syncedFolder : SyncedFolder ,
518- formatter : SimpleDateFormat
519- ): Long {
520- var lastModificationTime = file.lastModified()
521- if (MediaFolderType .IMAGE == syncedFolder.type && hasExif(file)) {
522- Log_OC .d(TAG , " calculateLastModificationTime exif found" )
523-
524- @Suppress(" TooGenericExceptionCaught" )
525- try {
526- val exifInterface = ExifInterface (file.absolutePath)
527- val exifDate = exifInterface.getAttribute(ExifInterface .TAG_DATETIME )
528- if (! exifDate.isNullOrBlank()) {
529- val pos = ParsePosition (0 )
530- val dateTime = formatter.parse(exifDate, pos)
531- if (dateTime != null ) {
532- lastModificationTime = dateTime.time
533- Log_OC .w(TAG , " calculateLastModificationTime calculatedTime is: $lastModificationTime " )
534- } else {
535- Log_OC .w(TAG , " calculateLastModificationTime dateTime is empty" )
536- }
537- } else {
538- Log_OC .w(TAG , " calculateLastModificationTime exifDate is empty" )
539- }
540- } catch (e: Exception ) {
541- Log_OC .d(TAG , " Failed to get the proper time " + e.localizedMessage)
542- }
543- }
544- return lastModificationTime
545- }
546-
547449 private fun sendUploadFinishEvent (operation : UploadFileOperation , result : RemoteOperationResult <* >) {
548450 fileUploadBroadcastManager.sendFinished(
549451 operation,
0 commit comments