Skip to content

Commit d632b05

Browse files
committed
Manejando posibles escenarios al eliminar un registro de producto y su imagen en storage
1 parent 6f08734 commit d632b05

File tree

1 file changed

+41
-15
lines changed

1 file changed

+41
-15
lines changed

NiloPartner/app/src/main/java/com/barryzea/nilopartner/MainActivity.kt

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import com.google.firebase.auth.FirebaseAuth
3535
import com.google.firebase.firestore.*
3636
import com.google.firebase.ktx.Firebase
3737
import com.google.firebase.storage.FirebaseStorage
38+
import com.google.firebase.storage.StorageException
3839

3940
class MainActivity : AppCompatActivity(), OnProductListener, MainAux {
4041
private lateinit var bind:ActivityMainBinding
@@ -325,6 +326,8 @@ class MainActivity : AppCompatActivity(), OnProductListener, MainAux {
325326
0-> confirmDelete(product)
326327
1->{
327328
productSelected=product
329+
//En un dispositivo huawei(mate 10p lite) no funciona la badera ACTION_PICK con la combinación de EXTRA_ALLOW_MULTIPLE
330+
//así que lo cambiamos por ACTION_GET_CONTENT, no es muy amigable pero funciona
328331
val intent=Intent(Intent.ACTION_GET_CONTENT, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
329332
intent.type = "image/*"
330333
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
@@ -341,25 +344,39 @@ class MainActivity : AppCompatActivity(), OnProductListener, MainAux {
341344
.setTitle(R.string.delete_dialog_title)
342345
.setMessage(R.string.delete_dialog_msg)
343346
.setPositiveButton(R.string.delete_dialog_confirm){ _,_->
344-
val db=FirebaseFirestore.getInstance()
345347

346-
val dbRef=db.collection(COLLECTION_PRODUCT)
347348
product.id?.let{id->
348349
product.imgUrl?.let{url->
349-
val photoRef=FirebaseStorage.getInstance().getReferenceFromUrl(url)
350-
photoRef
351-
//FirebaseStorage.getInstance().reference.child(Constants.PRODUCT_IMAGE).child(id)
352-
.delete()
353-
.addOnSuccessListener {
354-
dbRef.document(id)
355-
.delete()
356-
.addOnFailureListener {
357-
Toast.makeText(this, "Error al eliminar registro", Toast.LENGTH_SHORT).show()
350+
//usamos el try catch en el caso de que la url de la imagen esté vacía
351+
//ya que estamos eliminando por referencia de url
352+
//si salta la excepción pasamos a eliminar el registro del producto directamente en el catch
353+
try {
354+
val photoRef=FirebaseStorage.getInstance().getReferenceFromUrl(url)
355+
photoRef
356+
//FirebaseStorage.getInstance().reference.child(Constants.PRODUCT_IMAGE).child(id)
357+
.delete()
358+
.addOnSuccessListener {
359+
deleteProductFromFirestore(id)
360+
}
361+
.addOnFailureListener {
362+
//Si la imágen ya no está en storage no nos permitirá eliminar el registro del producto
363+
//entonces tomamos la excepción desde este listener e intentamos borrar el registro
364+
//ya que la imagen no estará disponible
365+
if((it as StorageException).errorCode== StorageException.ERROR_OBJECT_NOT_FOUND)
366+
{
367+
deleteProductFromFirestore(id)
368+
}else {
369+
Toast.makeText(
370+
this,
371+
"Error al eliminar imagen",
372+
Toast.LENGTH_SHORT
373+
).show()
358374
}
359-
}
360-
.addOnFailureListener {
361-
Toast.makeText(this, "Error al eliminar imagen", Toast.LENGTH_SHORT).show()
362-
}
375+
}
376+
} catch (e: Exception) {
377+
e.printStackTrace()
378+
deleteProductFromFirestore(id)
379+
}
363380

364381

365382
}
@@ -371,6 +388,15 @@ class MainActivity : AppCompatActivity(), OnProductListener, MainAux {
371388
.show()
372389

373390
}
391+
private fun deleteProductFromFirestore(productId:String){
392+
val db=FirebaseFirestore.getInstance()
393+
val dbRef=db.collection(COLLECTION_PRODUCT)
394+
dbRef.document(productId)
395+
.delete()
396+
.addOnFailureListener {
397+
Toast.makeText(this, "Error al eliminar registro", Toast.LENGTH_SHORT).show()
398+
}
399+
}
374400

375401
override fun getProductSelected(): Product? =productSelected
376402
}

0 commit comments

Comments
 (0)