diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 1e7b162..fce6f39 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -20,8 +20,8 @@ android { applicationId = "com.docmost.app" minSdk = 26 targetSdk = 34 - versionCode = 8 - versionName = "1.0.7" + versionCode = 9 + versionName = "1.0.8" } signingConfigs { diff --git a/app/src/main/java/com/docmost/app/ui/SpacesActivity.kt b/app/src/main/java/com/docmost/app/ui/SpacesActivity.kt index d296a17..6145979 100644 --- a/app/src/main/java/com/docmost/app/ui/SpacesActivity.kt +++ b/app/src/main/java/com/docmost/app/ui/SpacesActivity.kt @@ -1739,39 +1739,83 @@ class SpacesActivity : AppCompatActivity() { return } - val view = layoutInflater.inflate(R.layout.dialog_search, null) + val view = layoutInflater.inflate(R.layout.dialog_cached_pages, null) + val tvTitle = view.findViewById(R.id.tvDialogTitle) + val tvSubtitle = view.findViewById(R.id.tvDialogSubtitle) val etSearch = view.findViewById(R.id.etSearch) - val rvResults = view.findViewById(R.id.rvSearchResults) - val tvEmpty = view.findViewById(R.id.tvSearchEmpty) - etSearch.visibility = View.GONE - tvEmpty.visibility = View.GONE + val rvResults = view.findViewById(R.id.rvCachedPages) + val tvEmpty = view.findViewById(R.id.tvEmpty) + + val allPages = cachedPages.sortedByDescending { it.updatedAt }.toMutableList() + val filteredPages = mutableListOf() + + tvTitle.text = getString(R.string.cached_pages) + tvSubtitle.text = getString(R.string.cached_count, allPages.size) + tvEmpty.text = getString(R.string.no_cached_pages_found) rvResults.layoutManager = LinearLayoutManager(this) - val results = cachedPages.toMutableList() - val adapter = object : androidx.recyclerview.widget.RecyclerView.Adapter() { - override fun getItemCount() = results.size - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): androidx.recyclerview.widget.RecyclerView.ViewHolder { - val v = layoutInflater.inflate(android.R.layout.simple_list_item_2, parent, false) - return object : androidx.recyclerview.widget.RecyclerView.ViewHolder(v) {} + val dateFormat = java.text.SimpleDateFormat("dd MMM yyyy", java.util.Locale.getDefault()) + + fun formatDate(millis: Long): String { + return try { + dateFormat.format(java.util.Date(millis)) + } catch (_: Exception) { + "" } - override fun onBindViewHolder(holder: androidx.recyclerview.widget.RecyclerView.ViewHolder, position: Int) { - val r = results[position] - val text1 = holder.itemView.findViewById(android.R.id.text1) - val text2 = holder.itemView.findViewById(android.R.id.text2) - text1.text = if (r.icon.isNullOrBlank()) r.title else "${r.icon} ${r.title}" - text2.text = r.spaceId ?: getString(R.string.offline_mode) + } + + fun updateList(pages: List) { + filteredPages.clear() + filteredPages.addAll(pages) + rvResults.adapter?.notifyDataSetChanged() + tvEmpty.visibility = if (filteredPages.isEmpty()) View.VISIBLE else View.GONE + rvResults.visibility = if (filteredPages.isEmpty()) View.GONE else View.VISIBLE + } + + val adapter = object : RecyclerView.Adapter() { + override fun getItemCount() = filteredPages.size + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + val v = layoutInflater.inflate(R.layout.item_cached_page, parent, false) + return object : RecyclerView.ViewHolder(v) {} + } + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + val r = filteredPages[position] + val tvIcon = holder.itemView.findViewById(R.id.tvPageIcon) + val tvItemTitle = holder.itemView.findViewById(R.id.tvPageTitle) + val tvDate = holder.itemView.findViewById(R.id.tvPageDate) + + tvIcon.text = if (r.icon.isNullOrBlank()) "📄" else r.icon + tvItemTitle.text = r.title + tvDate.text = formatDate(r.updatedAt) + holder.itemView.setOnClickListener { openPageEditor(Page(id = r.pageId, title = r.title, icon = r.icon, spaceId = r.spaceId)) } } } rvResults.adapter = adapter + updateList(allPages) - val maxHeight = (resources.displayMetrics.heightPixels * 0.6).toInt() + val maxHeight = (resources.displayMetrics.heightPixels * 0.7).toInt() rvResults.layoutParams.height = maxHeight - val dialog = BottomSheetDialog(this) + etSearch.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {} + override fun afterTextChanged(s: Editable?) { + val query = s?.toString()?.trim() ?: "" + if (query.isEmpty()) { + updateList(allPages) + return + } + val lowerQuery = query.lowercase() + val filtered = allPages.filter { it.title.lowercase().contains(lowerQuery) } + updateList(filtered) + } + }) + + val dialog = com.google.android.material.bottomsheet.BottomSheetDialog(this) dialog.setContentView(view) dialog.show() } diff --git a/app/src/main/res/layout/dialog_cached_pages.xml b/app/src/main/res/layout/dialog_cached_pages.xml new file mode 100644 index 0000000..ae066d1 --- /dev/null +++ b/app/src/main/res/layout/dialog_cached_pages.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_cached_page.xml b/app/src/main/res/layout/item_cached_page.xml new file mode 100644 index 0000000..abdf687 --- /dev/null +++ b/app/src/main/res/layout/item_cached_page.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 366eb9b..4ab15b8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -128,4 +128,6 @@ ¿Eliminar todas las páginas descargadas? Las borradores locales se conservarán. Caché limpiada: %d páginas eliminadas Páginas en caché: %d + Buscar páginas guardadas… + No se encontraron páginas