Skip to content

Commit 841c178

Browse files
committed
add onAutoUploadFolderRemoved
Signed-off-by: alperozturk96 <alper_ozturk@proton.me>
1 parent acbb113 commit 841c178

File tree

7 files changed

+167
-53
lines changed

7 files changed

+167
-53
lines changed

app/src/main/java/com/nextcloud/client/jobs/upload/FileUploadHelper.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ import com.owncloud.android.lib.resources.files.model.ServerFileInterface
4444
import com.owncloud.android.lib.resources.status.OCCapability
4545
import com.owncloud.android.operations.RemoveFileOperation
4646
import com.owncloud.android.operations.UploadFileOperation
47-
import com.owncloud.android.ui.activity.SyncedFoldersActivity
4847
import com.owncloud.android.utils.DisplayUtils
4948
import com.owncloud.android.utils.FileUtil
5049
import kotlinx.coroutines.CoroutineScope
@@ -641,10 +640,15 @@ class FileUploadHelper {
641640
}
642641
}
643642

644-
suspend fun getAutoUploadFolderEntity(file: ServerFileInterface, user: User): SyncedFolderEntity? {
643+
suspend fun getAutoUploadFolder(files: List<OCFile>, accountName: String): List<SyncedFolderEntity> =
644+
files.mapNotNull { file ->
645+
getAutoUploadFolderEntity(file, accountName)
646+
}
647+
648+
suspend fun getAutoUploadFolderEntity(file: ServerFileInterface, accountName: String): SyncedFolderEntity? {
645649
val dao = uploadsStorageManager.syncedFolderDao
646650
val normalizedRemotePath = file.remotePath.trimEnd()
647651
if (normalizedRemotePath.isEmpty()) return null
648-
return dao.findByRemotePathAndAccount(normalizedRemotePath, user.accountName)
652+
return dao.findByRemotePathAndAccount(normalizedRemotePath, accountName)
649653
}
650654
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*
2+
* Nextcloud - Android Client
3+
*
4+
* SPDX-FileCopyrightText: 2026 Alper Ozturk <alper.ozturk@nextcloud.com>
5+
* SPDX-License-Identifier: AGPL-3.0-or-later
6+
*/
7+
8+
package com.nextcloud.utils.extensions
9+
10+
import com.owncloud.android.R
11+
import com.owncloud.android.datamodel.OCFile
12+
import com.owncloud.android.ui.activity.FileActivity
13+
import com.owncloud.android.ui.activity.FileDisplayActivity
14+
import com.owncloud.android.ui.activity.OnFilesRemovedListener
15+
16+
fun FileActivity.removeFiles(
17+
offlineFiles: List<OCFile>,
18+
files: List<OCFile>,
19+
onlyLocalCopy: Boolean,
20+
filesRemovedListener: OnFilesRemovedListener?
21+
) {
22+
connectivityService.isNetworkAndServerAvailable { isAvailable ->
23+
if (isAvailable) {
24+
showLoadingDialog(getString(R.string.wait_a_moment))
25+
26+
(this as? FileDisplayActivity)
27+
?.deleteBatchTracker
28+
?.startBatchDelete(files.size)
29+
30+
if (files.isNotEmpty()) {
31+
val inBackground = (files.size != 1)
32+
fileOperationsHelper?.removeFiles(files, onlyLocalCopy, inBackground)
33+
}
34+
35+
if (offlineFiles.isNotEmpty()) {
36+
filesRemovedListener?.onFilesRemoved()
37+
}
38+
39+
dismissLoadingDialog()
40+
} else {
41+
if (onlyLocalCopy) {
42+
fileOperationsHelper?.removeFiles(files, true, true)
43+
} else {
44+
files.forEach(storageManager::addRemoveFileOfflineOperation)
45+
}
46+
47+
filesRemovedListener?.onFilesRemoved()
48+
}
49+
}
50+
}

app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt

Lines changed: 59 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ import com.nextcloud.client.account.User
6060
import com.nextcloud.client.appinfo.AppInfo
6161
import com.nextcloud.client.core.AsyncRunner
6262
import com.nextcloud.client.core.Clock
63+
import com.nextcloud.client.database.entity.SyncedFolderEntity
6364
import com.nextcloud.client.di.Injectable
6465
import com.nextcloud.client.editimage.EditImageActivity
6566
import com.nextcloud.client.files.DeepLinkHandler
@@ -78,6 +79,7 @@ import com.nextcloud.model.WorkerState.OfflineOperationsCompleted
7879
import com.nextcloud.ui.composeActivity.ComposeProcessTextAlias
7980
import com.nextcloud.utils.extensions.getParcelableArgument
8081
import com.nextcloud.utils.extensions.isActive
82+
import com.nextcloud.utils.extensions.isDialogFragmentReady
8183
import com.nextcloud.utils.extensions.lastFragment
8284
import com.nextcloud.utils.extensions.logFileSize
8385
import com.nextcloud.utils.extensions.navigateToAllFiles
@@ -114,6 +116,7 @@ import com.owncloud.android.ui.asynctasks.CheckAvailableSpaceTask
114116
import com.owncloud.android.ui.asynctasks.CheckAvailableSpaceTask.CheckAvailableSpaceListener
115117
import com.owncloud.android.ui.asynctasks.FetchRemoteFileTask
116118
import com.owncloud.android.ui.asynctasks.GetRemoteFileTask
119+
import com.owncloud.android.ui.dialog.ConfirmationDialogFragment
117120
import com.owncloud.android.ui.dialog.DeleteBatchTracker
118121
import com.owncloud.android.ui.dialog.SendShareDialog.SendShareDialogDownloader
119122
import com.owncloud.android.ui.dialog.SortingOrderDialogFragment.OnSortingOrderListener
@@ -2185,26 +2188,68 @@ class FileDisplayActivity :
21852188
}
21862189
supportInvalidateOptionsMenu()
21872190
fetchRecommendedFilesIfNeeded(ignoreETag = true, currentDir)
2191+
} else {
2192+
if (result.isSslRecoverableException) {
2193+
mLastSslUntrustedServerResult = result
2194+
showUntrustedCertDialog(mLastSslUntrustedServerResult)
2195+
}
2196+
}
2197+
}
21882198

2189-
// clean stale upload entities for auto upload folder
2190-
if (removedFile.isFolder) {
2199+
override fun onAutoUploadFolderRemoved(
2200+
entities: List<SyncedFolderEntity>,
2201+
filesToRemove: List<OCFile>,
2202+
onlyLocalCopy: Boolean
2203+
) {
2204+
val dialog = ConfirmationDialogFragment.newInstance(
2205+
messageResId = R.string.auto_upload_delete_dialog_description,
2206+
messageArguments = null,
2207+
titleResId = R.string.auto_upload_delete_dialog_title,
2208+
titleIconId = R.drawable.ic_info,
2209+
positiveButtonTextId = R.string.common_delete,
2210+
negativeButtonTextId = R.string.common_cancel,
2211+
neutralButtonTextId = -1
2212+
)
2213+
2214+
dialog.setOnConfirmationListener(object : ConfirmationDialogFragment.ConfirmationDialogFragmentListener {
2215+
override fun onConfirmation(callerTag: String?) {
21912216
lifecycleScope.launch(Dispatchers.IO) {
2192-
val optionalUser = user
2193-
if (user.isEmpty) {
2194-
return@launch
2217+
entities.forEach { entity ->
2218+
entity.id?.toLong()?.let {
2219+
fileUploadHelper.removeEntityFromUploadEntities(it)
2220+
syncedFolderProvider.deleteSyncedFolder(it)
2221+
}
21952222
}
21962223

2197-
val autoUploadFolder = fileUploadHelper
2198-
.getAutoUploadFolderEntity(removedFile, optionalUser.get()) ?: return@launch
2199-
2200-
autoUploadFolder.id?.toLong()?.let { fileUploadHelper.removeEntityFromUploadEntities(it) }
2224+
withContext(Dispatchers.Main) {
2225+
connectivityService.isNetworkAndServerAvailable { isAvailable ->
2226+
if (isAvailable) {
2227+
fileOperationsHelper?.removeFiles(
2228+
filesToRemove,
2229+
onlyLocalCopy,
2230+
true
2231+
)
2232+
} else {
2233+
if (onlyLocalCopy) {
2234+
fileOperationsHelper?.removeFiles(filesToRemove, true, true)
2235+
} else {
2236+
filesToRemove.forEach { file ->
2237+
fileDataStorageManager.addRemoveFileOfflineOperation(file)
2238+
}
2239+
}
2240+
}
2241+
onFilesRemoved()
2242+
}
2243+
}
22012244
}
22022245
}
2203-
} else {
2204-
if (result.isSslRecoverableException) {
2205-
mLastSslUntrustedServerResult = result
2206-
showUntrustedCertDialog(mLastSslUntrustedServerResult)
2207-
}
2246+
2247+
override fun onNeutral(callerTag: String?) = Unit
2248+
override fun onCancel(callerTag: String?) = Unit
2249+
})
2250+
2251+
if (isDialogFragmentReady(dialog)) {
2252+
dialog.show(supportFragmentManager, null)
22082253
}
22092254
}
22102255

app/src/main/java/com/owncloud/android/ui/activity/OnFilesRemovedListener.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,14 @@
77

88
package com.owncloud.android.ui.activity
99

10+
import com.nextcloud.client.database.entity.SyncedFolderEntity
11+
import com.owncloud.android.datamodel.OCFile
12+
1013
interface OnFilesRemovedListener {
1114
fun onFilesRemoved()
15+
fun onAutoUploadFolderRemoved(
16+
entities: List<SyncedFolderEntity>,
17+
filesToRemove: List<OCFile>,
18+
onlyLocalCopy: Boolean
19+
)
1220
}

app/src/main/java/com/owncloud/android/ui/dialog/RemoveFilesDialogFragment.kt

Lines changed: 32 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,23 @@ import android.app.Dialog
1616
import android.os.Bundle
1717
import android.view.ActionMode
1818
import androidx.appcompat.app.AlertDialog
19+
import androidx.lifecycle.lifecycleScope
1920
import com.google.android.material.button.MaterialButton
21+
import com.nextcloud.client.account.UserAccountManager
2022
import com.nextcloud.client.di.Injectable
23+
import com.nextcloud.client.jobs.upload.FileUploadHelper
2124
import com.nextcloud.client.network.ConnectivityService
2225
import com.nextcloud.utils.extensions.getTypedActivity
26+
import com.nextcloud.utils.extensions.removeFiles
2327
import com.owncloud.android.R
2428
import com.owncloud.android.datamodel.FileDataStorageManager
2529
import com.owncloud.android.datamodel.OCFile
2630
import com.owncloud.android.ui.activity.FileActivity
27-
import com.owncloud.android.ui.activity.FileDisplayActivity
2831
import com.owncloud.android.ui.activity.OnFilesRemovedListener
2932
import com.owncloud.android.ui.dialog.ConfirmationDialogFragment.ConfirmationDialogFragmentListener
33+
import kotlinx.coroutines.Dispatchers
34+
import kotlinx.coroutines.launch
35+
import kotlinx.coroutines.withContext
3036
import javax.inject.Inject
3137

3238
/**
@@ -46,6 +52,9 @@ class RemoveFilesDialogFragment :
4652
@Inject
4753
lateinit var connectivityService: ConnectivityService
4854

55+
@Inject
56+
lateinit var userAccountManager: UserAccountManager
57+
4958
private var positiveButton: MaterialButton? = null
5059

5160
override fun onStart() {
@@ -94,44 +103,31 @@ class RemoveFilesDialogFragment :
94103
}
95104

96105
private fun removeFiles(onlyLocalCopy: Boolean) {
97-
val (offlineFiles, files) = mTargetFiles?.partition { it.isOfflineOperation } ?: Pair(emptyList(), emptyList())
98-
99-
offlineFiles.forEach {
100-
fileDataStorageManager.deleteOfflineOperation(it)
101-
}
102-
103-
val fileActivity = getTypedActivity(FileActivity::class.java)
104-
val fda = getTypedActivity(FileDisplayActivity::class.java)
105-
val filesRemovedListener = getTypedActivity(OnFilesRemovedListener::class.java)
106-
connectivityService.isNetworkAndServerAvailable { isAvailable ->
107-
if (isAvailable) {
108-
fileActivity?.showLoadingDialog(fileActivity.getString(R.string.wait_a_moment))
109-
110-
fda?.deleteBatchTracker?.startBatchDelete(files.size)
111-
112-
if (files.isNotEmpty()) {
113-
// Display the snackbar message only when a single file is deleted.
114-
val inBackground = (files.size != 1)
115-
fileActivity?.fileOperationsHelper?.removeFiles(files, onlyLocalCopy, inBackground)
116-
}
117-
118-
if (offlineFiles.isNotEmpty()) {
119-
filesRemovedListener?.onFilesRemoved()
106+
val (offlineFiles, files) = mTargetFiles
107+
?.partition { it.isOfflineOperation }
108+
?: (emptyList<OCFile>() to emptyList())
109+
110+
offlineFiles.forEach(fileDataStorageManager::deleteOfflineOperation)
111+
112+
val listener = getTypedActivity(OnFilesRemovedListener::class.java)
113+
114+
lifecycleScope.launch(Dispatchers.IO) {
115+
val autoUploadEntities =
116+
FileUploadHelper.instance().getAutoUploadFolder(files, userAccountManager.user.accountName)
117+
withContext(Dispatchers.Main) {
118+
if (autoUploadEntities.isNotEmpty()) {
119+
listener?.onAutoUploadFolderRemoved(
120+
entities = autoUploadEntities,
121+
filesToRemove = files,
122+
onlyLocalCopy = onlyLocalCopy
123+
)
124+
return@withContext
120125
}
121126

122-
fileActivity?.dismissLoadingDialog()
123-
} else {
124-
if (onlyLocalCopy) {
125-
fileActivity?.fileOperationsHelper?.removeFiles(files, true, true)
126-
} else {
127-
files.forEach { file ->
128-
fileDataStorageManager.addRemoveFileOfflineOperation(file)
129-
}
130-
}
131-
filesRemovedListener?.onFilesRemoved()
127+
val fileActivity = getTypedActivity(FileActivity::class.java)
128+
fileActivity?.removeFiles(offlineFiles, files, onlyLocalCopy, listener)
129+
finishActionMode()
132130
}
133-
134-
finishActionMode()
135131
}
136132
}
137133

app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import androidx.localbroadcastmanager.content.LocalBroadcastManager
2222
import androidx.viewpager2.widget.ViewPager2
2323
import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback
2424
import com.nextcloud.client.account.User
25+
import com.nextcloud.client.database.entity.SyncedFolderEntity
2526
import com.nextcloud.client.di.Injectable
2627
import com.nextcloud.client.editimage.EditImageActivity
2728
import com.nextcloud.client.jobs.download.FileDownloadEventBroadcaster
@@ -216,6 +217,12 @@ class PreviewImageActivity :
216217
initViewPager()
217218
}
218219

220+
override fun onAutoUploadFolderRemoved(
221+
entities: List<SyncedFolderEntity>,
222+
filesToRemove: List<OCFile>,
223+
onlyLocalCopy: Boolean
224+
) = Unit
225+
219226
fun initViewPager() {
220227
if (user.isPresent) {
221228
initViewPager(user.get())

app/src/main/res/values/strings.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1471,6 +1471,10 @@
14711471
<string name="create_link">Create link</string>
14721472
<string name="folder_best_viewed_in">This folder is best viewed in %1$s.</string>
14731473
<string name="open_in_app">Open in %1$s</string>
1474+
<string name="auto_upload_delete_dialog_title">Delete auto-upload folder?</string>
1475+
<string name="auto_upload_delete_dialog_description">
1476+
This will remove the folder and auto-upload configuration. Any unfinished uploads will be canceled.
1477+
</string>
14741478
<string name="auto_upload_battery_saver_mode_warning">Auto-upload is paused because Battery Saver is on.</string>
14751479
<string name="auto_upload_sub_folder_warning">This folder is already included in the parent folder’s sync, which may cause duplicate uploads</string>
14761480
<string name="sync_anyway">Sync anyway</string>

0 commit comments

Comments
 (0)