Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ class UnifiedSearchFragmentIT : AbstractIT() {
scenario.onActivity { activity ->
onIdleSync {
EspressoIdlingResource.increment()
val sut = UnifiedSearchFragment.newInstance(null, null)
val sut = UnifiedSearchFragment.newInstance(null, null, "/")
activity.addFragment(sut)

sut.onSearchResultChanged(
Expand Down Expand Up @@ -83,7 +83,7 @@ class UnifiedSearchFragmentIT : AbstractIT() {
onIdleSync {
EspressoIdlingResource.increment()

val sut = UnifiedSearchFragment.newInstance(null, null)
val sut = UnifiedSearchFragment.newInstance(null, null, "/")
val testViewModel = UnifiedSearchViewModel(activity.application)
testViewModel.setConnectivityService(activity.connectivityServiceMock)
val localRepository = UnifiedSearchFakeRepository()
Expand Down
12 changes: 12 additions & 0 deletions app/src/main/java/com/nextcloud/client/database/dao/FileDao.kt
Original file line number Diff line number Diff line change
Expand Up @@ -108,4 +108,16 @@ interface FileDao {
dirType: String = MimeType.DIRECTORY,
webdavType: String = MimeType.WEBDAV_FOLDER
): List<FileEntity>

@Query(
"""
SELECT *
FROM filelist
WHERE file_owner = :fileOwner
AND parent = :parentId
AND ${ProviderTableMeta.FILE_NAME} LIKE '%' || :query || '%'
ORDER BY ${ProviderTableMeta.FILE_DEFAULT_SORT_ORDER}
"""
)
fun searchFilesInFolder(parentId: Long, fileOwner: String, query: String): List<FileEntity>
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@ enum class SearchResultEntryType {
Unknown;

fun iconId(): Int = when (this) {
CalendarEvent -> R.drawable.file_calendar
Folder -> R.drawable.folder
Note -> R.drawable.ic_edit
Contact -> R.drawable.file_vcard
CalendarEvent -> R.drawable.file_calendar
Deck -> R.drawable.ic_deck
else -> R.drawable.ic_find_in_page
Unknown -> R.drawable.ic_find_in_page
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@ package com.nextcloud.utils.extensions
import com.owncloud.android.datamodel.FileDataStorageManager
import com.owncloud.android.datamodel.OCFile

fun FileDataStorageManager.searchFilesByName(file: OCFile, accountName: String, query: String): List<OCFile> =
fileDao.searchFilesInFolder(file.fileId, accountName, query).map {
createFileInstance(it)
}

fun FileDataStorageManager.getParentIdsOfSubfiles(paths: List<String>): List<Long> =
fileDao.getParentIdsOfSubfiles(paths)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2927,7 +2927,12 @@ class FileDisplayActivity :
}

fun performUnifiedSearch(query: String, listOfHiddenFiles: ArrayList<String>?) {
val unifiedSearchFragment = UnifiedSearchFragment.Companion.newInstance(query, listOfHiddenFiles)
val unifiedSearchFragment =
UnifiedSearchFragment.Companion.newInstance(
query,
listOfHiddenFiles,
currentDir.decryptedRemotePath
)
setLeftFragment(unifiedSearchFragment, false)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import com.google.android.material.chip.ChipGroup
import com.owncloud.android.databinding.ListItemBinding
import com.owncloud.android.ui.AvatarGroupLayout

internal class OCFileListItemViewHolder(private var binding: ListItemBinding) :
class OCFileListItemViewHolder(private var binding: ListItemBinding) :
RecyclerView.ViewHolder(
binding.root
),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
/*
* Nextcloud - Android Client
*
* SPDX-FileCopyrightText: 2025 Alper Ozturk <[email protected]>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

package com.owncloud.android.ui.adapter

import android.content.Context
import com.afollestad.sectionedrecyclerview.SectionedViewHolder
import com.nextcloud.android.common.ui.theme.utils.ColorRole
import com.nextcloud.client.account.User
import com.nextcloud.client.preferences.AppPreferences
import com.nextcloud.utils.extensions.setVisibleIf
import com.owncloud.android.databinding.UnifiedSearchCurrentDirectoryItemBinding
import com.owncloud.android.datamodel.FileDataStorageManager
import com.owncloud.android.datamodel.OCFile
import com.owncloud.android.datamodel.SyncedFolderProvider
import com.owncloud.android.ui.interfaces.UnifiedSearchCurrentDirItemAction
import com.owncloud.android.utils.DisplayUtils
import com.owncloud.android.utils.FileStorageUtils
import com.owncloud.android.utils.theme.ViewThemeUtils

@Suppress("LongParameterList")
class UnifiedSearchCurrentDirItemViewHolder(
val binding: UnifiedSearchCurrentDirectoryItemBinding,
val context: Context,
private val viewThemeUtils: ViewThemeUtils,
private val storageManager: FileDataStorageManager,
private val isRTL: Boolean,
private val user: User,
private val appPreferences: AppPreferences,
private val syncedFolderProvider: SyncedFolderProvider,
private val action: UnifiedSearchCurrentDirItemAction
) : SectionedViewHolder(binding.unifiedSearchCurrentDirItemLayout) {

fun bind(file: OCFile) {
val filenameWithExtension = storageManager.getFilenameConsideringOfflineOperation(file)
val isFolder = file.isFolder
val (filename, extension) = FileStorageUtils.getFilenameAndExtension(filenameWithExtension, isFolder, isRTL)
binding.extension.setVisibleIf(!isFolder)
binding.extension.text = extension
binding.filename.text = filename
viewThemeUtils.platform.colorImageView(binding.thumbnail, ColorRole.PRIMARY)
DisplayUtils.setThumbnail(
file,
binding.thumbnail,
user,
storageManager,
listOf(),
false,
context,
binding.thumbnailShimmer,
appPreferences,
viewThemeUtils,
syncedFolderProvider
)

binding.more.setOnClickListener {
action.openFile(file.decryptedRemotePath, true)
}

binding.unifiedSearchCurrentDirItemLayout.setOnClickListener {
action.openFile(file.decryptedRemotePath, false)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,34 +8,30 @@
package com.owncloud.android.ui.adapter

import android.content.Context
import android.graphics.drawable.Drawable
import android.view.View
import androidx.core.content.res.ResourcesCompat
import com.afollestad.sectionedrecyclerview.SectionedViewHolder
import com.nextcloud.android.common.ui.theme.utils.ColorRole
import com.nextcloud.client.account.User
import com.nextcloud.common.NextcloudClient
import com.nextcloud.model.SearchResultEntryType
import com.nextcloud.utils.CalendarEventManager
import com.nextcloud.utils.ContactManager
import com.nextcloud.utils.GlideHelper
import com.nextcloud.utils.extensions.getType
import com.owncloud.android.databinding.UnifiedSearchItemBinding
import com.owncloud.android.datamodel.FileDataStorageManager
import com.owncloud.android.lib.common.OwnCloudClientManagerFactory
import com.owncloud.android.lib.common.SearchResultEntry
import com.owncloud.android.ui.interfaces.UnifiedSearchListInterface
import com.owncloud.android.utils.MimeTypeUtil
import com.owncloud.android.utils.theme.ViewThemeUtils

@Suppress("LongParameterList")
class UnifiedSearchItemViewHolder(
private val supportsOpeningCalendarContactsLocally: Boolean,
val binding: UnifiedSearchItemBinding,
private val user: User,
private val storageManager: FileDataStorageManager,
private val listInterface: UnifiedSearchListInterface,
private val filesAction: FilesAction,
val context: Context,
private val nextcloudClient: NextcloudClient,
private val viewThemeUtils: ViewThemeUtils
) : SectionedViewHolder(binding.root) {

Expand All @@ -56,12 +52,8 @@ class UnifiedSearchItemViewHolder(
binding.localFileIndicator.visibility = View.GONE
}

val mimetype = MimeTypeUtil.getBestMimeTypeByFilename(entry.title)

val entryType = entry.getType()
val placeholder = getPlaceholder(entry, entryType, mimetype)
val nextcloudClient =
OwnCloudClientManagerFactory.getDefaultSingleton().getNextcloudClientFor(user.toOwnCloudAccount(), context)
viewThemeUtils.platform.colorImageView(binding.thumbnail, ColorRole.PRIMARY)
GlideHelper.loadIntoImageView(
context,
nextcloudClient,
Expand Down Expand Up @@ -104,18 +96,4 @@ class UnifiedSearchItemViewHolder(
listInterface.onSearchResultClicked(entry)
}
}

private fun getPlaceholder(
entry: SearchResultEntry,
entryType: SearchResultEntryType,
mimetype: String?
): Drawable {
val iconId = entryType.run {
iconId()
}

val defaultDrawable = MimeTypeUtil.getFileTypeIcon(mimetype, entry.title, context, viewThemeUtils)
val drawable: Drawable = ResourcesCompat.getDrawable(context.resources, iconId, null) ?: defaultDrawable
return viewThemeUtils.platform.tintDrawable(context, drawable, ColorRole.PRIMARY)
}
}
Loading
Loading