Add a confirmation when deleting a source

A popup appears after tapping the delete source button with the name of the source.
This commit is contained in:
davidoskky 2025-02-28 20:01:15 +01:00
parent f38936f9b4
commit 3ad2ad402f
2 changed files with 41 additions and 31 deletions

View File

@ -8,6 +8,7 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Button import android.widget.Button
import android.widget.Toast import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.ConstraintLayout
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import bou.amine.apps.readerforselfossv2.android.R import bou.amine.apps.readerforselfossv2.android.R
@ -39,10 +40,7 @@ class SourcesListAdapter(
private val repository: Repository by instance() private val repository: Repository by instance()
private val appSettingsService: AppSettingsService by instance() private val appSettingsService: AppSettingsService by instance()
override fun onCreateViewHolder( override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
parent: ViewGroup,
viewType: Int,
): ViewHolder {
binding = SourceListItemBinding.inflate(LayoutInflater.from(parent.context), parent, false) binding = SourceListItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ViewHolder(binding.root) return ViewHolder(binding.root)
} }
@ -51,50 +49,31 @@ class SourcesListAdapter(
holder: ViewHolder, holder: ViewHolder,
position: Int, position: Int,
) { ) {
val itm = items[position] val source = items[position]
val deleteBtn: Button = holder.mView.findViewById(R.id.deleteBtn) val deleteBtn: Button = holder.mView.findViewById(R.id.deleteBtn)
deleteBtn.setOnClickListener { deleteBtn.setOnClickListener { this.showDeleteConfirmationDialog(source, position) }
val (id, title) = items[position]
CoroutineScope(Dispatchers.IO).launch {
val successfullyDeletedSource = repository.deleteSource(id, title)
if (successfullyDeletedSource) {
items.removeAt(position)
notifyItemRemoved(position)
notifyItemRangeChanged(position, itemCount)
} else {
Toast
.makeText(
app,
R.string.can_delete_source,
Toast.LENGTH_SHORT,
).show()
}
}
}
holder.mView.setOnClickListener { holder.mView.setOnClickListener {
val source = items[position]
repository.setSelectedSource(source) repository.setSelectedSource(source)
app.startActivity(Intent(app, UpsertSourceActivity::class.java)) app.startActivity(Intent(app, UpsertSourceActivity::class.java))
} }
if (itm.getIcon(repository.baseUrl).isEmpty()) { if (source.getIcon(repository.baseUrl).isEmpty()) {
binding.itemImage.setBackgroundAndText(itm.title.getHtmlDecoded()) binding.itemImage.setBackgroundAndText(source.title.getHtmlDecoded())
} else { } else {
c.circularDrawable(itm.getIcon(repository.baseUrl), binding.itemImage, appSettingsService) c.circularDrawable(source.getIcon(repository.baseUrl), binding.itemImage, appSettingsService)
} }
if (!itm.error.isNullOrBlank()) { if (!source.error.isNullOrBlank()) {
binding.errorText.visibility = View.VISIBLE binding.errorText.visibility = View.VISIBLE
binding.errorText.text = itm.error binding.errorText.text = source.error
} else { } else {
binding.errorText.visibility = View.GONE binding.errorText.visibility = View.GONE
} }
binding.sourceTitle.text = itm.title.getHtmlDecoded() binding.sourceTitle.text = source.title.getHtmlDecoded()
} }
override fun getItemId(position: Int) = position.toLong() override fun getItemId(position: Int) = position.toLong()
@ -103,6 +82,35 @@ class SourcesListAdapter(
override fun getItemCount(): Int = items.size override fun getItemCount(): Int = items.size
private fun showDeleteConfirmationDialog(source: SelfossModel.SourceDetail, position: Int) {
AlertDialog.Builder(app)
.setTitle(app.getString(R.string.confirm_delete_title))
.setMessage(app.getString(R.string.confirm_delete_message, source.title))
.setPositiveButton(android.R.string.ok) { _, _ -> deleteSource(source, position) }
.setNegativeButton(android.R.string.cancel, null)
.show()
}
private fun deleteSource(source: SelfossModel.SourceDetail, position: Int) {
CoroutineScope(Dispatchers.IO).launch {
val successfullyDeletedSource = repository.deleteSource(source.id, source.title)
launch(Dispatchers.Main) {
if (successfullyDeletedSource) {
items.removeAt(position)
notifyItemRemoved(position)
notifyItemRangeChanged(position, itemCount)
} else {
Toast.makeText(
app,
R.string.can_delete_source,
Toast.LENGTH_SHORT,
).show()
}
}
}
}
inner class ViewHolder( inner class ViewHolder(
val mView: ConstraintLayout, val mView: ConstraintLayout,
) : RecyclerView.ViewHolder(mView) ) : RecyclerView.ViewHolder(mView)

View File

@ -131,4 +131,6 @@
<string name="action_about">"About"</string> <string name="action_about">"About"</string>
<string name="marked_as_read">"Item read"</string> <string name="marked_as_read">"Item read"</string>
<string name="marked_as_unread">"Item unread"</string> <string name="marked_as_unread">"Item unread"</string>
<string name="confirm_delete_title">Confirm Deletion</string>
<string name="confirm_delete_message">Are you sure you want to delete the following source?\n%s</string>
</resources> </resources>