From 619f06fc6a834e3ed77811d3b94959ecbb0458ba Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Fri, 14 Aug 2026 14:53:28 +0200 Subject: [PATCH] feat(oome): empty state Signed-off-by: alperozturk96 --- .../android/ui/activity/FileDisplayActivity.kt | 5 +++++ .../android/ui/activity/FolderPickerActivity.kt | 8 +++++++- .../android/ui/asynctasks/GallerySearchTask.kt | 12 ++++++++---- .../android/ui/fragment/ExtendedListFragment.kt | 9 +++++++++ .../android/ui/fragment/GalleryFragment.kt | 14 ++++++++++---- .../android/ui/fragment/OCFileListSearchTask.kt | 14 ++++++++++++-- .../com/owncloud/android/ui/fragment/SearchType.kt | 3 ++- .../ui/trashbin/RemoteTrashbinRepository.kt | 10 +++++++++- app/src/main/res/values/strings.xml | 1 + gradle/libs.versions.toml | 2 +- gradle/verification-metadata.xml | 8 ++++++++ 11 files changed, 72 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index 0563dd7327db..e7f6807efd49 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt @@ -1657,10 +1657,15 @@ class FileDisplayActivity : RemoteOperationResult.ResultCode.NO_NETWORK_CONNECTION -> showInfoBox(R.string.offline_mode) RemoteOperationResult.ResultCode.HOST_NOT_AVAILABLE -> showInfoBox(R.string.host_not_available) RemoteOperationResult.ResultCode.SIGNING_TOS_NEEDED -> showTermsOfServiceDialog() + RemoteOperationResult.ResultCode.OUT_OF_MEMORY -> showOutOfMemoryEmptyListState() else -> {} } } + private fun showOutOfMemoryEmptyListState() { + listOfFilesFragment?.setEmptyListMessage(EmptyListState.OUT_OF_MEMORY) + } + private fun showTermsOfServiceDialog() { if (supportFragmentManager.findFragmentByTag(DIALOG_TAG_SHOW_TOS) == null) { TermsOfServiceDialog().show(supportFragmentManager, DIALOG_TAG_SHOW_TOS) diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt index b0b5c69e0b7a..c97330f5ca4f 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt +++ b/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt @@ -555,6 +555,8 @@ open class FolderPickerActivity : "Detekt.LongMethod" ) // legacy code override fun onReceive(context: Context, intent: Intent) { + var emptyListState = EmptyListState.LOCAL_FILE_LIST_EMPTY_FILE + try { val event = intent.action Log_OC.d(TAG, "Received broadcast $event") @@ -569,6 +571,10 @@ open class FolderPickerActivity : return } + if (ResultCode.OUT_OF_MEMORY == syncResult.code) { + emptyListState = EmptyListState.OUT_OF_MEMORY + } + if (FileSyncAdapter.EVENT_FULL_SYNC_START != event) { var (currentFile, currentDir) = getCurrentFileAndDirectory() @@ -595,7 +601,7 @@ open class FolderPickerActivity : // in owncloud library with broadcast notifications pending to process DataHolderUtil.getInstance().delete(intent.getStringExtra(FileSyncAdapter.EXTRA_RESULT)) } finally { - listOfFilesFragment?.setEmptyListMessage(EmptyListState.LOCAL_FILE_LIST_EMPTY_FILE) + listOfFilesFragment?.setEmptyListMessage(emptyListState) } } diff --git a/app/src/main/java/com/owncloud/android/ui/asynctasks/GallerySearchTask.kt b/app/src/main/java/com/owncloud/android/ui/asynctasks/GallerySearchTask.kt index b75f9374dc47..d43085d6ac99 100644 --- a/app/src/main/java/com/owncloud/android/ui/asynctasks/GallerySearchTask.kt +++ b/app/src/main/java/com/owncloud/android/ui/asynctasks/GallerySearchTask.kt @@ -47,7 +47,7 @@ class GallerySearchTask( val result = performSearch(context) withContext(Dispatchers.Main) { - fragment.searchCompleted(result.emptySearch, result.lastTimestamp) + fragment.searchCompleted(result) } } @@ -62,7 +62,7 @@ class GallerySearchTask( return if (operationResult.isSuccess) { handleSuccess(operationResult) } else { - Result(false, false, NO_TIMESTAMP) + Result(operationResult.code, false, NO_TIMESTAMP) } } @@ -90,7 +90,7 @@ class GallerySearchTask( val remoteFiles = operationResult.data.filterIsInstance() val lastTimestamp = findLastTimestamp(remoteFiles) val emptySearch = parseMedia(lastTimestamp, endDate, remoteFiles) - return Result(true, emptySearch, lastTimestamp) + return Result(operationResult.code, emptySearch, lastTimestamp) } private fun findLastTimestamp(remoteFiles: List): Long = @@ -186,5 +186,9 @@ class GallerySearchTask( ) } - data class Result(val success: Boolean, val emptySearch: Boolean, val lastTimestamp: Long) + data class Result( + val resultCode: RemoteOperationResult.ResultCode, + val emptySearch: Boolean, + val lastTimestamp: Long + ) } diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.kt index aed275f33c5c..45f9063369b3 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.kt @@ -728,6 +728,15 @@ open class ExtendedListFragment : ) } + EmptyListState.OUT_OF_MEMORY -> { + setMessageForEmptyList( + R.string.common_error_out_memory, + R.string.file_list_out_of_memory_description, + R.drawable.ic_list_empty_error, + false + ) + } + else -> { setMessageForEmptyList( R.string.file_list_empty_headline, diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.kt index 3b12ee6bf401..d0c071c22651 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.kt @@ -39,6 +39,7 @@ import com.owncloud.android.BuildConfig import com.owncloud.android.R import com.owncloud.android.datamodel.OCFile import com.owncloud.android.datamodel.ThumbnailsCacheManager +import com.owncloud.android.lib.common.operations.RemoteOperationResult import com.owncloud.android.lib.common.utils.Log_OC import com.owncloud.android.ui.EmptyRecyclerView import com.owncloud.android.ui.activity.FileDisplayActivity @@ -264,20 +265,25 @@ class GalleryFragment : } } - fun searchCompleted(emptySearch: Boolean, lastTimeStamp: Long) { + fun searchCompleted(result: GallerySearchTask.Result) { if (!isAdded) return this.isPhotoSearchQueryRunning = false - if (lastTimeStamp > -1) { - endDate = lastTimeStamp + if (result.resultCode == RemoteOperationResult.ResultCode.OUT_OF_MEMORY) { + setEmptyListMessage(EmptyListState.OUT_OF_MEMORY) + return + } + + if (result.lastTimestamp > -1) { + endDate = result.lastTimestamp } if (adapter?.isEmpty() == true) { setEmptyListMessage(SearchType.GALLERY_SEARCH) } - if (!emptySearch) { + if (!result.emptySearch) { showAllGalleryItems() } diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListSearchTask.kt b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListSearchTask.kt index e63a6188fd72..3e54e20630e9 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListSearchTask.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListSearchTask.kt @@ -73,8 +73,9 @@ class OCFileListSearchTask( updateAdapterData(fragment, cachedFiles) } - val result = fetchRemoteResults()?.takeIf { it.isSuccess } ?: run { - showSnackbarError(fragment) + val result = fetchRemoteResults() + if (result == null || !result.isSuccess) { + showError(fragment, result) return@launch } @@ -89,6 +90,15 @@ class OCFileListSearchTask( } } + private suspend fun showError(fragment: OCFileListFragment, result: RemoteOperationResult>?) { + if (result?.code == RemoteOperationResult.ResultCode.OUT_OF_MEMORY) { + withContext(Dispatchers.Main) { fragment.setEmptyListMessage(EmptyListState.OUT_OF_MEMORY) } + return + } + + showSnackbarError(fragment) + } + private suspend fun showSnackbarError(fragment: OCFileListFragment) { withContext(Dispatchers.Main) { fragment.activity?.let { diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/SearchType.kt b/app/src/main/java/com/owncloud/android/ui/fragment/SearchType.kt index 8ccf5bf5c9b7..b829c597880e 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/SearchType.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/SearchType.kt @@ -45,5 +45,6 @@ enum class EmptyListState : Parcelable { ONLY_ON_DEVICE, LOCAL_FILE_LIST_EMPTY_FILE, LOCAL_FILE_LIST_EMPTY_FOLDER, - ERROR + ERROR, + OUT_OF_MEMORY } diff --git a/app/src/main/java/com/owncloud/android/ui/trashbin/RemoteTrashbinRepository.kt b/app/src/main/java/com/owncloud/android/ui/trashbin/RemoteTrashbinRepository.kt index d05391bc1122..1eec774f3d39 100644 --- a/app/src/main/java/com/owncloud/android/ui/trashbin/RemoteTrashbinRepository.kt +++ b/app/src/main/java/com/owncloud/android/ui/trashbin/RemoteTrashbinRepository.kt @@ -13,10 +13,12 @@ package com.owncloud.android.ui.trashbin import android.os.AsyncTask +import androidx.annotation.StringRes import com.nextcloud.client.account.User import com.nextcloud.client.network.ClientFactory import com.nextcloud.client.network.ClientFactory.CreationException import com.owncloud.android.R +import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode import com.owncloud.android.lib.common.utils.Log_OC import com.owncloud.android.lib.resources.trashbin.EmptyTrashbinRemoteOperation import com.owncloud.android.lib.resources.trashbin.ReadTrashbinFolderRemoteOperation @@ -131,6 +133,9 @@ class RemoteTrashbinRepository internal constructor(private val user: User, priv ) : AsyncTask() { private var trashbinFiles: List? = null + @StringRes + private var errorMessage: Int = R.string.trashbin_loading_failed + @Deprecated("Deprecated in Java") override fun doInBackground(vararg voids: Void?): Boolean = try { val client = clientFactory.create(user) @@ -139,6 +144,9 @@ class RemoteTrashbinRepository internal constructor(private val user: User, priv trashbinFiles = result.resultData true } else { + if (result.code == ResultCode.OUT_OF_MEMORY) { + errorMessage = R.string.file_list_out_of_memory_description + } false } } catch (e: CreationException) { @@ -152,7 +160,7 @@ class RemoteTrashbinRepository internal constructor(private val user: User, priv if (success) { callback.onSuccess(trashbinFiles) } else { - callback.onError(R.string.trashbin_loading_failed) + callback.onError(errorMessage) } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c42e00c8dcfc..4533e1c8200b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -15,6 +15,7 @@ Media Poor connection Check your internet connection or try again later + Could not able to load content %1$s Android app version %1$s version %1$s, build #%2$s diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9a9f4a5a0e07..031a88e3d1bb 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ androidCommonLibraryVersion = "0.33.2" androidGifDrawableVersion = "1.2.32" androidImageCropperVersion = "4.7.0" -androidLibraryVersion ="c28feb04383aa123629222ecb702c3f428b225d9" +androidLibraryVersion ="fca2fdfc6c" androidOpensslVersion = "3.5.6" androidPluginVersion = "9.3.1" androidsvgVersion = "1.4" diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 9949afe1a7aa..3444761cbe49 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -22338,6 +22338,14 @@ + + + + + + + +