Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@ public abstract class PreferenceManager {
public static final String PREF__CAMERA_PICTURE_UPLOADS_LAST_SYNC = "picture_uploads_last_sync";
public static final String PREF__CAMERA_VIDEO_UPLOADS_LAST_SYNC = "video_uploads_last_sync";
public static final String PREF__CAMERA_UPLOADS_DEFAULT_PATH = "/CameraUpload";
public static final String PREF__CAMERA_PICTURE_UPLOADS_USE_SUBFOLDERS_BEHAVIOUR = "picture_uploads_use_subfolders_behaviour";
public static final String PREF__CAMERA_VIDEO_UPLOADS_USE_SUBFOLDERS_BEHAVIOUR = "video_uploads_use_subfolders_behaviour";
public static final String PREF__LEGACY_FINGERPRINT = "set_fingerprint";
/**
* Constant to access value of last path selected by the user to upload a file shared from other app.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,9 @@ import eu.opencloud.android.db.PreferenceManager.PREF__CAMERA_PICTURE_UPLOADS_LA
import eu.opencloud.android.db.PreferenceManager.PREF__CAMERA_PICTURE_UPLOADS_PATH
import eu.opencloud.android.db.PreferenceManager.PREF__CAMERA_PICTURE_UPLOADS_SOURCE
import eu.opencloud.android.db.PreferenceManager.PREF__CAMERA_PICTURE_UPLOADS_WIFI_ONLY
import eu.opencloud.android.db.PreferenceManager.PREF__CAMERA_PICTURE_UPLOADS_USE_SUBFOLDERS_BEHAVIOUR
import eu.opencloud.android.domain.automaticuploads.model.UploadBehavior
import eu.opencloud.android.domain.automaticuploads.model.UseSubfoldersBehaviour
import eu.opencloud.android.extensions.collectLatestLifecycleFlow
import eu.opencloud.android.extensions.showAlertDialog
import eu.opencloud.android.extensions.showMessageInSnackbar
Expand All @@ -71,6 +73,7 @@ class SettingsPictureUploadsFragment : PreferenceFragmentCompat() {
private var prefPictureUploadsOnCharging: CheckBoxPreference? = null
private var prefPictureUploadsSourcePath: Preference? = null
private var prefPictureUploadsBehaviour: ListPreference? = null
private var prefPictureUploadsUseSubfolderBehaviour: ListPreference? = null
private var prefPictureUploadsAccount: ListPreference? = null
private var prefPictureUploadsLastSync: Preference? = null
private var spaceId: String? = null
Expand Down Expand Up @@ -109,6 +112,20 @@ class SettingsPictureUploadsFragment : PreferenceFragmentCompat() {
).toTypedArray()
entryValues = listOf(UploadBehavior.COPY.name, UploadBehavior.MOVE.name).toTypedArray()
}
prefPictureUploadsUseSubfolderBehaviour = findPreference<ListPreference>(PREF__CAMERA_PICTURE_UPLOADS_USE_SUBFOLDERS_BEHAVIOUR)?.apply {
entries = listOf(
getString(R.string.pref_use_subfolders_behaviour_none),
getString(R.string.pref_use_subfolders_behaviour_year),
getString(R.string.pref_use_subfolders_behaviour_year_month),
getString(R.string.pref_use_subfolders_behaviour_year_month_day),
).toTypedArray()
entryValues = listOf(
UseSubfoldersBehaviour.NONE.name,
UseSubfoldersBehaviour.YEAR.name,
UseSubfoldersBehaviour.YEAR_MONTH.name,
UseSubfoldersBehaviour.YEAR_MONTH_DAY.name
).toTypedArray()
}
prefPictureUploadsAccount = findPreference(PREF__CAMERA_PICTURE_UPLOADS_ACCOUNT_NAME)

val comment = getString(R.string.prefs_camera_upload_source_path_title_required)
Expand Down Expand Up @@ -155,6 +172,7 @@ class SettingsPictureUploadsFragment : PreferenceFragmentCompat() {
prefPictureUploadsOnWifi?.isChecked = it.wifiOnly
prefPictureUploadsOnCharging?.isChecked = it.chargingOnly
prefPictureUploadsBehaviour?.value = it.behavior.name
prefPictureUploadsUseSubfolderBehaviour?.value = it.useSubfoldersBehaviour.name
prefPictureUploadsLastSync?.summary = DisplayUtils.unixTimeToHumanReadable(it.lastSyncTimestamp)
spaceId = it.spaceId
} ?: resetFields()
Expand Down Expand Up @@ -223,6 +241,12 @@ class SettingsPictureUploadsFragment : PreferenceFragmentCompat() {
true
}

prefPictureUploadsUseSubfolderBehaviour?.setOnPreferenceChangeListener { _, newValue ->
newValue as String
picturesViewModel.handleSelectUseSubfoldersBehaviour(newValue)
true
}

prefPictureUploadsOnWifi?.setOnPreferenceChangeListener { _, newValue ->
newValue as Boolean
picturesViewModel.useWifiOnly(newValue)
Expand Down Expand Up @@ -264,6 +288,7 @@ class SettingsPictureUploadsFragment : PreferenceFragmentCompat() {
prefPictureUploadsSourcePath?.isEnabled = value
prefPictureUploadsBehaviour?.isEnabled = value
prefPictureUploadsAccount?.isEnabled = value
prefPictureUploadsUseSubfolderBehaviour?.isEnabled = value
prefPictureUploadsLastSync?.isEnabled = value
}

Expand All @@ -274,6 +299,7 @@ class SettingsPictureUploadsFragment : PreferenceFragmentCompat() {
prefPictureUploadsOnWifi?.isChecked = false
prefPictureUploadsOnCharging?.isChecked = false
prefPictureUploadsBehaviour?.value = UploadBehavior.COPY.name
prefPictureUploadsUseSubfolderBehaviour?.value = UseSubfoldersBehaviour.NONE.name
prefPictureUploadsLastSync?.summary = null
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import eu.opencloud.android.db.PreferenceManager.PREF__CAMERA_UPLOADS_DEFAULT_PA
import eu.opencloud.android.domain.automaticuploads.model.FolderBackUpConfiguration
import eu.opencloud.android.domain.automaticuploads.model.FolderBackUpConfiguration.Companion.pictureUploadsName
import eu.opencloud.android.domain.automaticuploads.model.UploadBehavior
import eu.opencloud.android.domain.automaticuploads.model.UseSubfoldersBehaviour
import eu.opencloud.android.domain.automaticuploads.usecases.GetPictureUploadsConfigurationStreamUseCase
import eu.opencloud.android.domain.automaticuploads.usecases.ResetPictureUploadsUseCase
import eu.opencloud.android.domain.automaticuploads.usecases.SavePictureUploadsConfigurationUseCase
Expand Down Expand Up @@ -121,6 +122,16 @@ class SettingsPictureUploadsViewModel(
}
}

fun handleSelectUseSubfoldersBehaviour(behaviourString: String) {
val behaviour = UseSubfoldersBehaviour.fromString(behaviourString)

viewModelScope.launch(coroutinesDispatcherProvider.io) {
savePictureUploadsConfigurationUseCase(
SavePictureUploadsConfigurationUseCase.Params(composePictureUploadsConfiguration(useSubfoldersBehaviour = behaviour))
)
}
}

fun getPictureUploadsAccount() = _pictureUploads.value?.accountName

fun getPictureUploadsPath() = _pictureUploads.value?.uploadPath ?: PREF__CAMERA_UPLOADS_DEFAULT_PATH
Expand Down Expand Up @@ -196,6 +207,7 @@ class SettingsPictureUploadsViewModel(
chargingOnly: Boolean? = _pictureUploads.value?.chargingOnly,
sourcePath: String? = _pictureUploads.value?.sourcePath,
behavior: UploadBehavior? = _pictureUploads.value?.behavior,
useSubfoldersBehaviour: UseSubfoldersBehaviour? = _pictureUploads.value?.useSubfoldersBehaviour,
timestamp: Long? = _pictureUploads.value?.lastSyncTimestamp,
spaceId: String? = _pictureUploads.value?.spaceId,
): FolderBackUpConfiguration = FolderBackUpConfiguration(
Expand All @@ -205,6 +217,7 @@ class SettingsPictureUploadsViewModel(
uploadPath = uploadPath ?: PREF__CAMERA_UPLOADS_DEFAULT_PATH,
wifiOnly = wifiOnly ?: false,
chargingOnly = chargingOnly ?: false,
useSubfoldersBehaviour = useSubfoldersBehaviour ?: UseSubfoldersBehaviour.NONE,
lastSyncTimestamp = timestamp ?: System.currentTimeMillis(),
name = _pictureUploads.value?.name ?: pictureUploadsName,
spaceId = spaceId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,10 @@ import eu.opencloud.android.db.PreferenceManager.PREF__CAMERA_VIDEO_UPLOADS_CHAR
import eu.opencloud.android.db.PreferenceManager.PREF__CAMERA_VIDEO_UPLOADS_ENABLED
import eu.opencloud.android.db.PreferenceManager.PREF__CAMERA_VIDEO_UPLOADS_PATH
import eu.opencloud.android.db.PreferenceManager.PREF__CAMERA_VIDEO_UPLOADS_SOURCE
import eu.opencloud.android.db.PreferenceManager.PREF__CAMERA_VIDEO_UPLOADS_USE_SUBFOLDERS_BEHAVIOUR
import eu.opencloud.android.db.PreferenceManager.PREF__CAMERA_VIDEO_UPLOADS_WIFI_ONLY
import eu.opencloud.android.domain.automaticuploads.model.UploadBehavior
import eu.opencloud.android.domain.automaticuploads.model.UseSubfoldersBehaviour
import eu.opencloud.android.extensions.collectLatestLifecycleFlow
import eu.opencloud.android.extensions.showAlertDialog
import eu.opencloud.android.extensions.showMessageInSnackbar
Expand All @@ -71,6 +73,7 @@ class SettingsVideoUploadsFragment : PreferenceFragmentCompat() {
private var prefVideoUploadsOnCharging: CheckBoxPreference? = null
private var prefVideoUploadsSourcePath: Preference? = null
private var prefVideoUploadsBehaviour: ListPreference? = null
private var prefVideoUploadsUseSubfolderBehaviour: ListPreference? = null
private var prefVideoUploadsAccount: ListPreference? = null
private var prefVideoUploadsLastSync: Preference? = null
private var spaceId: String? = null
Expand Down Expand Up @@ -107,6 +110,20 @@ class SettingsVideoUploadsFragment : PreferenceFragmentCompat() {
getString(R.string.pref_behaviour_entries_remove_original_file)).toTypedArray()
entryValues = listOf(UploadBehavior.COPY.name, UploadBehavior.MOVE.name).toTypedArray()
}
prefVideoUploadsUseSubfolderBehaviour = findPreference<ListPreference>(PREF__CAMERA_VIDEO_UPLOADS_USE_SUBFOLDERS_BEHAVIOUR)?.apply {
entries = listOf(
getString(R.string.pref_use_subfolders_behaviour_none),
getString(R.string.pref_use_subfolders_behaviour_year),
getString(R.string.pref_use_subfolders_behaviour_year_month),
getString(R.string.pref_use_subfolders_behaviour_year_month_day),
).toTypedArray()
entryValues = listOf(
UseSubfoldersBehaviour.NONE.name,
UseSubfoldersBehaviour.YEAR.name,
UseSubfoldersBehaviour.YEAR_MONTH.name,
UseSubfoldersBehaviour.YEAR_MONTH_DAY.name
).toTypedArray()
}
prefVideoUploadsAccount = findPreference<ListPreference>(PREF__CAMERA_VIDEO_UPLOADS_ACCOUNT_NAME)

val comment = getString(R.string.prefs_camera_upload_source_path_title_required)
Expand Down Expand Up @@ -153,6 +170,7 @@ class SettingsVideoUploadsFragment : PreferenceFragmentCompat() {
prefVideoUploadsOnWifi?.isChecked = it.wifiOnly
prefVideoUploadsOnCharging?.isChecked = it.chargingOnly
prefVideoUploadsBehaviour?.value = it.behavior.name
prefVideoUploadsUseSubfolderBehaviour?.value = it.useSubfoldersBehaviour.name
prefVideoUploadsLastSync?.summary = DisplayUtils.unixTimeToHumanReadable(it.lastSyncTimestamp)
spaceId = it.spaceId
} ?: resetFields()
Expand Down Expand Up @@ -221,6 +239,12 @@ class SettingsVideoUploadsFragment : PreferenceFragmentCompat() {
true
}

prefVideoUploadsUseSubfolderBehaviour?.setOnPreferenceChangeListener { _, newValue ->
newValue as String
videosViewModel.handleSelectUseSubfoldersBehaviour(newValue)
true
}

prefVideoUploadsOnWifi?.setOnPreferenceChangeListener { _, newValue ->
newValue as Boolean
videosViewModel.useWifiOnly(newValue)
Expand Down Expand Up @@ -262,6 +286,7 @@ class SettingsVideoUploadsFragment : PreferenceFragmentCompat() {
prefVideoUploadsSourcePath?.isEnabled = value
prefVideoUploadsBehaviour?.isEnabled = value
prefVideoUploadsAccount?.isEnabled = value
prefVideoUploadsUseSubfolderBehaviour?.isEnabled = value
prefVideoUploadsLastSync?.isEnabled = value
}

Expand All @@ -272,6 +297,7 @@ class SettingsVideoUploadsFragment : PreferenceFragmentCompat() {
prefVideoUploadsOnWifi?.isChecked = false
prefVideoUploadsOnCharging?.isChecked = false
prefVideoUploadsBehaviour?.value = UploadBehavior.COPY.name
prefVideoUploadsUseSubfolderBehaviour?.value = UseSubfoldersBehaviour.NONE.name
prefVideoUploadsLastSync?.summary = null
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import eu.opencloud.android.db.PreferenceManager.PREF__CAMERA_UPLOADS_DEFAULT_PA
import eu.opencloud.android.domain.automaticuploads.model.FolderBackUpConfiguration
import eu.opencloud.android.domain.automaticuploads.model.FolderBackUpConfiguration.Companion.videoUploadsName
import eu.opencloud.android.domain.automaticuploads.model.UploadBehavior
import eu.opencloud.android.domain.automaticuploads.model.UseSubfoldersBehaviour
import eu.opencloud.android.domain.automaticuploads.usecases.GetVideoUploadsConfigurationStreamUseCase
import eu.opencloud.android.domain.automaticuploads.usecases.ResetVideoUploadsUseCase
import eu.opencloud.android.domain.automaticuploads.usecases.SaveVideoUploadsConfigurationUseCase
Expand Down Expand Up @@ -121,6 +122,16 @@ class SettingsVideoUploadsViewModel(
}
}

fun handleSelectUseSubfoldersBehaviour(behaviourString: String) {
val behaviour = UseSubfoldersBehaviour.fromString(behaviourString)

viewModelScope.launch(coroutinesDispatcherProvider.io) {
saveVideoUploadsConfigurationUseCase(
SaveVideoUploadsConfigurationUseCase.Params(composeVideoUploadsConfiguration(useSubfoldersBehaviour = behaviour))
)
}
}

fun getVideoUploadsAccount() = _videoUploads.value?.accountName

fun getVideoUploadsPath() = _videoUploads.value?.uploadPath ?: PREF__CAMERA_UPLOADS_DEFAULT_PATH
Expand Down Expand Up @@ -196,6 +207,7 @@ class SettingsVideoUploadsViewModel(
chargingOnly: Boolean? = _videoUploads.value?.chargingOnly,
sourcePath: String? = _videoUploads.value?.sourcePath,
behavior: UploadBehavior? = _videoUploads.value?.behavior,
useSubfoldersBehaviour: UseSubfoldersBehaviour? = _videoUploads.value?.useSubfoldersBehaviour,
timestamp: Long? = _videoUploads.value?.lastSyncTimestamp,
spaceId: String? = _videoUploads.value?.spaceId,
): FolderBackUpConfiguration =
Expand All @@ -207,6 +219,7 @@ class SettingsVideoUploadsViewModel(
wifiOnly = wifiOnly ?: false,
chargingOnly = chargingOnly ?: false,
lastSyncTimestamp = timestamp ?: System.currentTimeMillis(),
useSubfoldersBehaviour = useSubfoldersBehaviour ?: UseSubfoldersBehaviour.NONE,
name = _videoUploads.value?.name ?: videoUploadsName,
spaceId = spaceId,
).also {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,23 +32,27 @@ import eu.opencloud.android.R
import eu.opencloud.android.domain.UseCaseResult
import eu.opencloud.android.domain.automaticuploads.model.FolderBackUpConfiguration
import eu.opencloud.android.domain.automaticuploads.model.UploadBehavior
import eu.opencloud.android.domain.automaticuploads.model.UseSubfoldersBehaviour
import eu.opencloud.android.domain.automaticuploads.usecases.GetAutomaticUploadsConfigurationUseCase
import eu.opencloud.android.domain.automaticuploads.usecases.SavePictureUploadsConfigurationUseCase
import eu.opencloud.android.domain.automaticuploads.usecases.SaveVideoUploadsConfigurationUseCase
import eu.opencloud.android.domain.transfers.TransferRepository
import eu.opencloud.android.domain.transfers.model.OCTransfer
import eu.opencloud.android.domain.transfers.model.TransferStatus
import eu.opencloud.android.presentation.settings.SettingsActivity
import eu.opencloud.android.domain.transfers.model.UploadEnqueuedBy
import eu.opencloud.android.presentation.settings.SettingsActivity
import eu.opencloud.android.usecases.transfers.uploads.UploadFileFromContentUriUseCase
import eu.opencloud.android.utils.MimetypeIconUtil
import eu.opencloud.android.utils.NotificationUtils
import eu.opencloud.android.utils.UPLOAD_NOTIFICATION_CHANNEL_ID
import org.koin.core.component.KoinComponent
import org.koin.core.component.inject

import timber.log.Timber
import java.io.File
import java.time.Instant
import java.time.LocalDateTime
import java.time.ZoneId
import java.time.format.DateTimeFormatter
import java.util.Date
import java.util.concurrent.TimeUnit

Expand Down Expand Up @@ -144,9 +148,10 @@ class AutomaticUploadsWorker(
showNotification(syncType, localPicturesDocumentFiles.size)

for (documentFile in localPicturesDocumentFiles) {
val uploadPath = buildUploadPath(documentFile, folderBackUpConfiguration)
val uploadId = storeInUploadsDatabase(
documentFile = documentFile,
uploadPath = folderBackUpConfiguration.uploadPath.plus(File.separator).plus(documentFile.name),
uploadPath = uploadPath,
accountName = folderBackUpConfiguration.accountName,
behavior = folderBackUpConfiguration.behavior,
createdByWorker = when (syncType) {
Expand All @@ -157,7 +162,7 @@ class AutomaticUploadsWorker(
)
enqueueSingleUpload(
contentUri = documentFile.uri,
uploadPath = folderBackUpConfiguration.uploadPath.plus(File.separator).plus(documentFile.name),
uploadPath = uploadPath,
lastModified = documentFile.lastModified(),
behavior = folderBackUpConfiguration.behavior.toString(),
accountName = folderBackUpConfiguration.accountName,
Expand All @@ -169,6 +174,38 @@ class AutomaticUploadsWorker(
updateTimestamp(folderBackUpConfiguration, syncType, currentTimestamp)
}

private fun buildUploadPath(
documentFile: DocumentFile,
folderBackUpConfiguration: FolderBackUpConfiguration,
): String {
val pathBuilder = StringBuilder(folderBackUpConfiguration.uploadPath.plus(File.separator))

val lastModifiedDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(documentFile.lastModified()), ZoneId.systemDefault())
val yearStr = lastModifiedDateTime.format(DateTimeFormatter.ofPattern("yyyy"))
val monthStr = lastModifiedDateTime.format(DateTimeFormatter.ofPattern("MM"))
val dayStr = lastModifiedDateTime.format(DateTimeFormatter.ofPattern("dd"))

when (folderBackUpConfiguration.useSubfoldersBehaviour) {
UseSubfoldersBehaviour.YEAR_MONTH_DAY -> {
pathBuilder.append(yearStr).append(File.separator)
pathBuilder.append(monthStr).append(File.separator)
pathBuilder.append(dayStr).append(File.separator)
}

UseSubfoldersBehaviour.YEAR_MONTH -> {
pathBuilder.append(yearStr).append(File.separator)
pathBuilder.append(monthStr).append(File.separator)
}

UseSubfoldersBehaviour.YEAR -> {
pathBuilder.append(yearStr).append(File.separator)
}

else -> {}
}
return pathBuilder.append(documentFile.name).toString()
}

private fun showNotification(
syncType: SyncType,
numberOfFilesToUpload: Int
Expand Down
Loading