Skip to content

Commit

Permalink
Add offline remove operation
Browse files Browse the repository at this point in the history
Signed-off-by: alperozturk <[email protected]>
  • Loading branch information
alperozturk96 committed Sep 12, 2024
1 parent 9191729 commit 9fd208f
Show file tree
Hide file tree
Showing 7 changed files with 90 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@ class OfflineOperationTypeAdapter : JsonSerializer<OfflineOperationType>, JsonDe
jsonObject.addProperty("mimeType", src.mimeType)
}

is OfflineOperationType.RemoveFile -> {
jsonObject.addProperty("type", src.type)
jsonObject.addProperty("path", src.path)
}

null -> Unit
}
return jsonObject
Expand All @@ -65,6 +70,11 @@ class OfflineOperationTypeAdapter : JsonSerializer<OfflineOperationType>, JsonDe
jsonObject.get("mimeType").asString
)

OfflineOperationRawType.RemoveFile.name -> OfflineOperationType.RemoveFile(
jsonObject.get("type").asString,
jsonObject.get("path").asString
)

else -> null
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult
import com.owncloud.android.lib.common.utils.Log_OC
import com.owncloud.android.lib.resources.files.UploadFileRemoteOperation
import com.owncloud.android.operations.CreateFolderOperation
import com.owncloud.android.operations.RemoveFileOperation
import com.owncloud.android.utils.theme.ViewThemeUtils
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.NonCancellable
Expand Down Expand Up @@ -141,6 +142,16 @@ class OfflineOperationsWorker(
createFileOperation.execute(client) to createFileOperation
}

is OfflineOperationType.RemoveFile -> {
val removeFileOperation = withContext(NonCancellable) {
val operationType = (operation.type as OfflineOperationType.RemoveFile)
val ocFile = fileDataStorageManager.getFileByDecryptedRemotePath(operationType.path)
RemoveFileOperation(ocFile, false, user, true, context, fileDataStorageManager)
}

removeFileOperation.execute(client) to removeFileOperation
}

else -> {
Log_OC.d(TAG, "Unsupported operation type: ${operation.type}")
null
Expand Down
5 changes: 3 additions & 2 deletions app/src/main/java/com/nextcloud/model/OfflineOperationType.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ package com.nextcloud.model

sealed class OfflineOperationType {
abstract val type: String

data class RemoveFile(override val type: String, var path: String) : OfflineOperationType()
data class CreateFolder(override val type: String, var path: String) : OfflineOperationType()
data class CreateFile(
override val type: String,
Expand All @@ -21,5 +21,6 @@ sealed class OfflineOperationType {

enum class OfflineOperationRawType {
CreateFolder,
CreateFile
CreateFile,
RemoveFile
}
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,24 @@ public void addCreateFileOfflineOperation(String[] localPaths, String[] remotePa
}
}

public OfflineOperationEntity getOfflineEntityFromOCFile(OCFile file) {
return offlineOperationDao.getByPath(file.getDecryptedRemotePath());
}

public void addRemoveFileOfflineOperation(String path, String filename, Long parentOCFileId) {
OfflineOperationEntity entity = new OfflineOperationEntity();

entity.setFilename(filename);
entity.setParentOCFileId(parentOCFileId);

OfflineOperationType.RemoveFile operationType = new OfflineOperationType.RemoveFile(OfflineOperationRawType.RemoveFile.name(), path);
entity.setType(operationType);
entity.setPath(path);
entity.setCreatedAt(System.currentTimeMillis() / 1000L);

offlineOperationDao.insert(entity);
}

public OfflineOperationEntity addCreateFolderOfflineOperation(String path, String filename, Long parentOCFileId) {
OfflineOperationEntity entity = new OfflineOperationEntity();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import com.nextcloud.client.database.entity.OfflineOperationEntity;
import com.nextcloud.client.jobs.upload.FileUploadHelper;
import com.nextcloud.client.preferences.AppPreferences;
import com.nextcloud.model.OfflineOperationType;
import com.nextcloud.utils.extensions.ViewExtensionsKt;
import com.owncloud.android.MainApp;
import com.owncloud.android.R;
Expand Down Expand Up @@ -599,27 +600,11 @@ private void bindListItemViewHolder(ListItemViewHolder holder, OCFile file) {
localSize = localFile.length();
}

holder.getFileSize().setVisibility(View.VISIBLE);

if (file.isOfflineOperation()) {
holder.getFileSize().setText(MainApp.string(R.string.oc_file_list_adapter_offline_operation_description_text));
holder.getFileSizeSeparator().setVisibility(View.GONE);
} else {
holder.getFileSize().setText(DisplayUtils.bytesToHumanReadable(localSize));
holder.getFileSizeSeparator().setVisibility(View.VISIBLE);
}
prepareFileSize(holder, file, localSize);
} else {
final long fileLength = file.getFileLength();
if (fileLength >= 0) {
holder.getFileSize().setVisibility(View.VISIBLE);

if (file.isOfflineOperation()) {
holder.getFileSize().setText(MainApp.string(R.string.oc_file_list_adapter_offline_operation_description_text));
holder.getFileSizeSeparator().setVisibility(View.GONE);
} else {
holder.getFileSize().setText(DisplayUtils.bytesToHumanReadable(fileLength));
holder.getFileSizeSeparator().setVisibility(View.VISIBLE);
}
prepareFileSize(holder, file, fileLength);
} else {
holder.getFileSize().setVisibility(View.GONE);
holder.getFileSizeSeparator().setVisibility(View.GONE);
Expand Down Expand Up @@ -657,6 +642,26 @@ private void bindListItemViewHolder(ListItemViewHolder holder, OCFile file) {
applyVisualsForOfflineOperations(holder, file);
}

private void prepareFileSize(ListItemViewHolder holder, OCFile file, long size) {
holder.getFileSize().setVisibility(View.VISIBLE);
ViewExtensionsKt.setVisibleIf(holder.getFileSizeSeparator(), !file.isOfflineOperation());
String fileSizeText = getFileSizeText(file, size);
holder.getFileSize().setText(fileSizeText);
}

private String getFileSizeText(OCFile file, long size) {
if (file.isOfflineOperation()) {
OfflineOperationEntity entity = mStorageManager.getOfflineEntityFromOCFile(file);
if (entity.getType() instanceof OfflineOperationType.RemoveFile) {
return activity.getString(R.string.oc_file_list_adapter_offline_operation_remove_description_text);
} else {
return activity.getString(R.string.oc_file_list_adapter_offline_operation_description_text);
}
} else {
return DisplayUtils.bytesToHumanReadable(size);
}
}

private void applyVisualsForOfflineOperations(ListItemViewHolder holder, OCFile file) {
ViewExtensionsKt.setVisibleIf(holder.getShared(), !file.isOfflineOperation());
setColorFilterForOfflineOperations(holder, file);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,24 +83,39 @@ class RemoveFilesDialogFragment : ConfirmationDialogFragment(), ConfirmationDial
removeFiles(true)
}

// TODO test with internet access, test without internet access for other offline operations, test with new offline operation
private fun removeFiles(onlyLocalCopy: Boolean) {
val (offlineFiles, files) = mTargetFiles?.partition { it.isOfflineOperation } ?: Pair(emptyList(), emptyList())

offlineFiles.forEach {
fileDataStorageManager.deleteOfflineOperation(it)
}

if (files.isNotEmpty()) {
val cg = activity as ComponentsGetter?
cg?.fileOperationsHelper?.removeFiles(files, onlyLocalCopy, false)
}
if (requireActivity() is FileDisplayActivity) {
val activity = requireActivity() as FileDisplayActivity
activity.connectivityService.isNetworkAndServerAvailable { result ->
if (result) {
if (files.isNotEmpty()) {
val cg = activity as ComponentsGetter?
cg?.fileOperationsHelper?.removeFiles(files, onlyLocalCopy, false)
}

if (offlineFiles.isNotEmpty()) {
val activity = requireActivity() as? FileDisplayActivity
activity?.refreshCurrentDirectory()
}
if (offlineFiles.isNotEmpty()) {
activity.refreshCurrentDirectory()
}
} else {
files.forEach { file ->
fileDataStorageManager.addRemoveFileOfflineOperation(
file.decryptedRemotePath,
file.fileName,
file.parentId
)
}
}

finishActionMode()
finishActionMode()
}
}
}

override fun onNeutral(callerTag: String?) {
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
<string name="menu_item_sort_by_date_oldest_first">Oldest first</string>
<string name="menu_item_sort_by_size_biggest_first">Biggest first</string>
<string name="menu_item_sort_by_size_smallest_first">Smallest first</string>
<string name="oc_file_list_adapter_offline_operation_remove_description_text">Pending Remove Operation</string>
<string name="oc_file_list_adapter_offline_operation_description_text">Pending Operation</string>
<string name="ecosystem_apps_display_assistant">Assistant</string>
<string name="unexpected_error_occurred">Unexpected error occurred</string>
Expand Down

0 comments on commit 9fd208f

Please sign in to comment.