diff --git a/app/src/main/java/com/nextcloud/utils/extensions/OCShareExtensions.kt b/app/src/main/java/com/nextcloud/utils/extensions/OCShareExtensions.kt index dcb43b34dbfd..b72274cb8a6b 100644 --- a/app/src/main/java/com/nextcloud/utils/extensions/OCShareExtensions.kt +++ b/app/src/main/java/com/nextcloud/utils/extensions/OCShareExtensions.kt @@ -10,6 +10,15 @@ package com.nextcloud.utils.extensions import com.nextcloud.client.database.entity.ShareEntity import com.owncloud.android.lib.resources.shares.OCShare +fun OCShare?.remainingDownloadLimit(): Int? { + val downloadLimit = this?.fileDownloadLimit ?: return null + return if (downloadLimit.limit > 0) { + downloadLimit.limit - downloadLimit.count + } else { + null + } +} + fun OCShare.hasFileRequestPermission(): Boolean = (isFolder && shareType?.isPublicOrMail() == true) fun List.mergeDistinctByToken(other: List): List = (this + other).distinctBy { it.token } diff --git a/app/src/main/java/com/owncloud/android/operations/GetFilesDownloadLimitOperation.kt b/app/src/main/java/com/owncloud/android/operations/GetFilesDownloadLimitOperation.kt deleted file mode 100644 index b3b35c541078..000000000000 --- a/app/src/main/java/com/owncloud/android/operations/GetFilesDownloadLimitOperation.kt +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Nextcloud - Android Client - * - * SPDX-FileCopyrightText: 2025 ZetaTom <70907959+zetatom@users.noreply.github.com> - * SPDX-License-Identifier: AGPL-3.0-or-later - */ - -package com.owncloud.android.operations - -import com.nextcloud.android.lib.resources.files.FileDownloadLimit -import com.nextcloud.android.lib.resources.files.GetFilesDownloadLimitRemoteOperation -import com.nextcloud.common.NextcloudClient -import com.owncloud.android.datamodel.FileDataStorageManager -import com.owncloud.android.lib.common.operations.RemoteOperationResult -import com.owncloud.android.lib.resources.shares.OCShare -import com.owncloud.android.operations.common.SyncOperation - -class GetFilesDownloadLimitOperation(val share: OCShare, storageManager: FileDataStorageManager) : - SyncOperation( - storageManager - ) { - override fun run(client: NextcloudClient): RemoteOperationResult> { - val token = share.token ?: return RemoteOperationResult(RemoteOperationResult.ResultCode.SHARE_NOT_FOUND) - val operation = GetFilesDownloadLimitRemoteOperation(token) - - val result = operation.execute(client) - - return result - } -} diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/LinkShareViewHolder.kt b/app/src/main/java/com/owncloud/android/ui/adapter/LinkShareViewHolder.kt index 4c6f3aa59af1..dd9a01832ccb 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/LinkShareViewHolder.kt +++ b/app/src/main/java/com/owncloud/android/ui/adapter/LinkShareViewHolder.kt @@ -18,6 +18,7 @@ import android.text.TextUtils import android.view.View import androidx.core.content.res.ResourcesCompat import androidx.recyclerview.widget.RecyclerView +import com.nextcloud.utils.extensions.remainingDownloadLimit import com.nextcloud.utils.mdm.MDMConfig import com.owncloud.android.R import com.owncloud.android.databinding.FileDetailsShareLinkShareItemBinding @@ -105,8 +106,8 @@ internal class LinkShareViewHolder(itemView: View) : RecyclerView.ViewHolder(ite } val downloadLimit = publicShare.fileDownloadLimit - if (downloadLimit != null && downloadLimit.limit > 0) { - val remaining = downloadLimit.limit - downloadLimit.count + if (downloadLimit != null) { + val remaining = publicShare.remainingDownloadLimit() ?: return val text = context.resources.getQuantityString( R.plurals.share_download_limit_description, remaining, diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailsSharingProcessFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailsSharingProcessFragment.kt index d1d2327a51ed..6052fa51df6c 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailsSharingProcessFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailsSharingProcessFragment.kt @@ -20,6 +20,7 @@ import com.nextcloud.client.di.Injectable import com.nextcloud.utils.extensions.getParcelableArgument import com.nextcloud.utils.extensions.getSerializableArgument import com.nextcloud.utils.extensions.isPublicOrMail +import com.nextcloud.utils.extensions.remainingDownloadLimit import com.nextcloud.utils.extensions.setVisibilityWithAnimation import com.nextcloud.utils.extensions.setVisibleIf import com.owncloud.android.R @@ -197,7 +198,6 @@ class FileDetailsSharingProcessFragment : setCheckboxStates() themeView() setVisibilitiesOfShareOption() - toggleNextButtonAvailability(isAnySharePermissionChecked()) logShareInfo() } @@ -491,15 +491,19 @@ class FileDetailsSharingProcessFragment : } private fun updateFileDownloadLimitView() { - if (canSetDownloadLimit()) { - binding.shareProcessSetDownloadLimitSwitch.visibility = View.VISIBLE + if (!canSetDownloadLimit()) { + return + } - val currentDownloadLimit = share?.fileDownloadLimit?.limit ?: capabilities.filesDownloadLimitDefault - if (currentDownloadLimit > 0) { - binding.shareProcessSetDownloadLimitSwitch.isChecked = true - showFileDownloadLimitInput(true) - binding.shareProcessSetDownloadLimitInput.setText("$currentDownloadLimit") - } + // user can set download limit thus no need to rely on current limit to show download limit + showFileDownloadLimitInput(true) + binding.shareProcessSetDownloadLimitSwitch.visibility = View.VISIBLE + binding.shareProcessSetDownloadLimitInput.visibility = View.VISIBLE + + val currentLimit = share?.remainingDownloadLimit() ?: return + if (currentLimit > 0) { + binding.shareProcessSetDownloadLimitSwitch.isChecked = true + binding.shareProcessSetDownloadLimitInput.setText(currentLimit.toString()) } } @@ -585,7 +589,6 @@ class FileDetailsSharingProcessFragment : val isCustomPermissionSelected = (optionId == R.id.custom_permission_radio_button) customPermissionLayout.setVisibilityWithAnimation(isCustomPermissionSelected) - toggleNextButtonAvailability(true) } // endregion } @@ -610,13 +613,6 @@ class FileDetailsSharingProcessFragment : ) } - private fun toggleNextButtonAvailability(value: Boolean) { - binding.run { - shareProcessBtnNext.isEnabled = value - shareProcessBtnNext.isClickable = value - } - } - @Suppress("NestedBlockDepth") private fun setCheckboxStates() { val currentPermissions = share?.permissions ?: permission @@ -674,7 +670,6 @@ class FileDetailsSharingProcessFragment : private fun togglePermission(isChecked: Boolean, permissionFlag: Int) { permission = SharePermissionManager.togglePermission(isChecked, permission, permissionFlag) - toggleNextButtonAvailability(true) } private fun showExpirationDateDialog(chosenDateInMillis: Long = chosenExpDateInMills) { @@ -779,14 +774,6 @@ class FileDetailsSharingProcessFragment : return } - if (!isSharePermissionChecked() && !isCustomPermissionSelectedAndAnyCustomPermissionTypeChecked()) { - DisplayUtils.showSnackMessage( - binding.root, - R.string.file_details_sharing_fragment_custom_permission_not_selected - ) - return - } - // if modifying existing share information then execute the process if (share != null) { updateShare() diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a48e76517e0a..9df94fe5e626 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1448,7 +1448,6 @@ Sync duplication Could not load content The device is likely not connected to the internet - Please select custom permission Unknown Upload Stopped – Storage Permission Required Your files cannot be uploaded without access to local storage. Tap to grant permission.