diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index eb0715bcef..d328881472 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -39,7 +39,7 @@ jobs: with: swap-size-gb: 10 - name: Initialize CodeQL - uses: github/codeql-action/init@29d86d22a34ea372b1bbf3b2dced2e25ca6b3384 # v3.26.1 + uses: github/codeql-action/init@429e1977040da7a23b6822b13c129cd1ba93dbb2 # v3.26.2 with: languages: ${{ matrix.language }} - name: Set up JDK 17 @@ -53,4 +53,4 @@ jobs: echo "org.gradle.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError" > "$HOME/.gradle/gradle.properties" ./gradlew assembleDebug - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@29d86d22a34ea372b1bbf3b2dced2e25ca6b3384 # v3.26.1 + uses: github/codeql-action/analyze@429e1977040da7a23b6822b13c129cd1ba93dbb2 # v3.26.2 diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 84e275c8a0..c438ba6f13 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -42,6 +42,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@29d86d22a34ea372b1bbf3b2dced2e25ca6b3384 # v3.26.1 + uses: github/codeql-action/upload-sarif@429e1977040da7a23b6822b13c129cd1ba93dbb2 # v3.26.2 with: sarif_file: results.sarif diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.UploadFilesActivityIT_search.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.UploadFilesActivityIT_search.png new file mode 100644 index 0000000000..a8960fa7d8 Binary files /dev/null and b/app/screenshots/gplay/debug/com.owncloud.android.ui.activity.UploadFilesActivityIT_search.png differ diff --git a/app/src/androidTest/java/com/owncloud/android/ui/activity/UploadFilesActivityIT.kt b/app/src/androidTest/java/com/owncloud/android/ui/activity/UploadFilesActivityIT.kt index 0b598e3efc..71aa4009f8 100644 --- a/app/src/androidTest/java/com/owncloud/android/ui/activity/UploadFilesActivityIT.kt +++ b/app/src/androidTest/java/com/owncloud/android/ui/activity/UploadFilesActivityIT.kt @@ -8,9 +8,16 @@ package com.owncloud.android.ui.activity import android.content.Intent +import androidx.annotation.UiThread +import androidx.test.espresso.Espresso.onView +import androidx.test.espresso.IdlingRegistry +import androidx.test.espresso.assertion.ViewAssertions.matches import androidx.test.espresso.intent.rule.IntentsTestRule +import androidx.test.espresso.matcher.ViewMatchers.isDisplayed +import androidx.test.espresso.matcher.ViewMatchers.isRoot import com.nextcloud.test.GrantStoragePermissionRule import com.owncloud.android.AbstractIT +import com.owncloud.android.utils.EspressoIdlingResource import com.owncloud.android.utils.FileStorageUtils import com.owncloud.android.utils.ScreenshotTest import org.junit.After @@ -20,6 +27,8 @@ import org.junit.Test import java.io.File class UploadFilesActivityIT : AbstractIT() { + private val testClassName = "com.owncloud.android.ui.activity.UploadFilesActivityIT" + @get:Rule var activityRule = IntentsTestRule(UploadFilesActivity::class.java, true, false) @@ -39,6 +48,16 @@ class UploadFilesActivityIT : AbstractIT() { directories.forEach { it.deleteRecursively() } } + @Before + fun registerIdlingResource() { + IdlingRegistry.getInstance().register(EspressoIdlingResource.countingIdlingResource) + } + + @After + fun unregisterIdlingResource() { + IdlingRegistry.getInstance().unregister(EspressoIdlingResource.countingIdlingResource) + } + @Test @ScreenshotTest fun noneSelected() { @@ -88,6 +107,33 @@ class UploadFilesActivityIT : AbstractIT() { screenshot(sut) } + @Test + @UiThread + @ScreenshotTest + fun search() { + val sut: UploadFilesActivity = activityRule.launchActivity(null) + + sut.runOnUiThread { + sut.fileListFragment.setFiles( + directories + + listOf( + File("1.txt"), + File("2.pdf"), + File("3.mp3") + ) + ) + + onIdleSync { + EspressoIdlingResource.increment() + sut.fileListFragment.performSearch("1.txt", arrayListOf(), false) + EspressoIdlingResource.decrement() + val screenShotName = createName(testClassName + "_" + "search", "") + onView(isRoot()).check(matches(isDisplayed())) + screenshotViaName(sut, screenShotName) + } + } + } + fun fileSelected() { val sut: UploadFilesActivity = activityRule.launchActivity(null) diff --git a/app/src/main/java/com/nextcloud/client/etm/pages/EtmBackgroundJobsFragment.kt b/app/src/main/java/com/nextcloud/client/etm/pages/EtmBackgroundJobsFragment.kt index 4f7ff91c13..d14686854c 100644 --- a/app/src/main/java/com/nextcloud/client/etm/pages/EtmBackgroundJobsFragment.kt +++ b/app/src/main/java/com/nextcloud/client/etm/pages/EtmBackgroundJobsFragment.kt @@ -80,6 +80,7 @@ class EtmBackgroundJobsFragment : EtmBaseFragment(), Injectable { private val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:MM:ssZ", Locale.getDefault()) var backgroundJobs: List = emptyList() + @SuppressLint("NotifyDataSetChanged") set(value) { field = value notifyDataSetChanged() diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java index 52d0d78672..90d5ff6246 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java @@ -246,6 +246,10 @@ public class ExtendedListFragment extends Fragment implements performSearch(query, listOfHiddenFiles, false); return true; } + if (adapter instanceof LocalFileListAdapter) { + performSearch(query, new ArrayList<>(), false); + return true; + } return false; } @@ -253,6 +257,7 @@ public class ExtendedListFragment extends Fragment implements handler.removeCallbacksAndMessages(null); RecyclerView.Adapter adapter = getRecyclerView().getAdapter(); Activity activity = getActivity(); + if (activity != null) { if (activity instanceof FileDisplayActivity) { if (isBackPressed && TextUtils.isEmpty(query)) { @@ -274,8 +279,7 @@ public class ExtendedListFragment extends Fragment implements new SearchEvent(query, SearchRemoteOperation.SearchType.FILE_SEARCH) ); } - } else if (adapter instanceof LocalFileListAdapter) { - LocalFileListAdapter localFileListAdapter = (LocalFileListAdapter) adapter; + } else if (adapter instanceof LocalFileListAdapter localFileListAdapter) { localFileListAdapter.filter(query); } }); @@ -284,10 +288,12 @@ public class ExtendedListFragment extends Fragment implements searchView.clearFocus(); } } - } else if (activity instanceof UploadFilesActivity) { + } else if (activity instanceof UploadFilesActivity uploadFilesActivity) { LocalFileListAdapter localFileListAdapter = (LocalFileListAdapter) adapter; - localFileListAdapter.filter(query); - ((UploadFilesActivity) activity).showToolbarSpinner(); + if (localFileListAdapter != null) { + localFileListAdapter.filter(query); + uploadFilesActivity.getFileListFragment().setLoading(false); + } } else if (activity instanceof FolderPickerActivity) { ((FolderPickerActivity) activity).search(query); } @@ -630,6 +636,10 @@ public class ExtendedListFragment extends Fragment implements setMessageForEmptyList(R.string.file_list_empty_headline_server_search, R.string.file_list_empty_gallery, R.drawable.file_image); + } else if (searchType == SearchType.LOCAL_SEARCH) { + setMessageForEmptyList(R.string.file_list_empty_headline_server_search, + R.string.file_list_empty_local_search, + R.drawable.ic_search_light_grey); } } }); diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java b/app/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java index 1e2875566b..e82f04e041 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java +++ b/app/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java @@ -374,7 +374,7 @@ public class LocalFileListFragment extends ExtendedListFragment implements new Handler().post(() -> { mAdapter.notifyDataSetChanged(); if (mAdapter.getFilesCount() == 0) { - setEmptyListMessage(SearchType.NO_SEARCH); + setEmptyListMessage(SearchType.LOCAL_SEARCH); } }); } 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 1b7e39215d..c28fdb3669 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 @@ -13,6 +13,7 @@ import kotlinx.parcelize.Parcelize @Parcelize enum class SearchType : Parcelable { NO_SEARCH, + LOCAL_SEARCH, REGULAR_FILTER, FILE_SEARCH, FAVORITE_SEARCH, diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 49de0edb10..6c9ca9fe31 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -512,6 +512,7 @@ Effacer les données Les paramètres, la base de données et les certificats du serveur provenant de %1$s seront définitivement effacés. \n\nLes fichiers téléchargés ne seront pas impactés.\n\nCette opération peut prendre du temps. Gestion de l\'espace + Vous avez atteint la limite maximum de téléversement. Veuillez téléverser moins de 500 fichiers à la fois. Le fichier ne peut être streamer Impossible de lire le fichier média Le fichier média n\'est pas correctement encodé @@ -666,8 +667,10 @@ Clair Selon le système Prévisualisation de l\'image + Téléchargement de l\'image afin de lancer l\'écran d\'édition, veuillez patienter… Il n\'y a aucun fichier local à prévisualiser L\'image ne peut pas être affichée + Le fichier n\'est pas téléchargé Le fichier n’existe pas Ce fichier est actuellement vérouillé par un autre utilisateur ou processus et ne peut donc pas être supprimé. Veuillez réessayer plus tard. Désolé @@ -678,6 +681,7 @@ Les notifications push ne sont pas disponibles actuellement. Le code QR ne peut être lu Le dossier est introuvable, l\'opération de synchronisation est annulée. + Impossible de trouver le fichier à téléverser Essayez %1$s sur votre appareil ! J\'aimerais vous inviter à utiliser %1$s sur votre appareil.\nTéléchargez-la ici : %2$s %1$s ou %2$s @@ -885,6 +889,9 @@ Supprimer définitivement Le chargement de la corbeille a échoué ! Des fichiers n\'ont pas pu être supprimés de manière définitive ! + Événement introuvable; vous pouvez toujours synchroniser pour mettre à jour. Redirection au web… + Contact introuvable, vous pouvez toujours synchroniser pour mettre à jour. Redirection au web... + Des permissions sont requises pour ouvrir le résultat de recherche, autrement ceci redirigera au web… Déverrouiller le fichier Il y a des commentaire non lus Désactiver le chiffrement diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index ee389bf54c..42a0bcc321 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -197,6 +197,7 @@ Nieuwe map Nieuwe presentatie Nieuw werkblad + Mapomschrijving toevoegen Inloggegevens uitgeschakeld Dagelijkse back-up Te back-uppen data diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d937ddf1e3..5c06a52d45 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1213,8 +1213,7 @@ Year/Month/Day Secure sharing is not set up for this user Resharing is not allowed during secure file drop - - + No file or folder matching your search Event not found, you can always sync to update. Redirecting to web… Contact not found, you can always sync to update. Redirecting to web… Permissions are required to open search result otherwise it will redirected to web…