AddFragment.kt 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package com.example.snapshots
  2. import android.annotation.SuppressLint
  3. import android.app.Activity
  4. import android.content.Intent
  5. import android.net.Uri
  6. import android.os.Bundle
  7. import android.provider.MediaStore
  8. import androidx.fragment.app.Fragment
  9. import android.view.LayoutInflater
  10. import android.view.View
  11. import android.view.ViewGroup
  12. import androidx.activity.result.contract.ActivityResultContracts
  13. import com.example.snapshots.databinding.FragmentAddBinding
  14. import com.google.android.material.snackbar.Snackbar
  15. import com.google.firebase.auth.FirebaseAuth
  16. import com.google.firebase.database.DatabaseReference
  17. import com.google.firebase.database.FirebaseDatabase
  18. import com.google.firebase.storage.FirebaseStorage
  19. import com.google.firebase.storage.StorageReference
  20. class AddFragment : Fragment() {
  21. private lateinit var mBinding: FragmentAddBinding
  22. private val PATHSNAPSHOT = "snapshots"
  23. private lateinit var mStorageReference: StorageReference
  24. private lateinit var mDatabaseReferenceRef: DatabaseReference
  25. private var mPhotoSelectedUri: Uri? = null
  26. override fun onCreateView(
  27. inflater: LayoutInflater, container: ViewGroup?,
  28. savedInstanceState: Bundle?
  29. ): View {
  30. mBinding = FragmentAddBinding.inflate(inflater, container, false)
  31. return mBinding.root
  32. }
  33. override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
  34. super.onViewCreated(view, savedInstanceState)
  35. mBinding.btnPost.setOnClickListener { postSnapshot() }
  36. mBinding.btnSelect.setOnClickListener { openGallery() }
  37. mStorageReference = FirebaseStorage.getInstance().reference
  38. mDatabaseReferenceRef = FirebaseDatabase.getInstance().reference.child(PATHSNAPSHOT) // Obtiene el nodo "snapshot"
  39. }
  40. private val galleryResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
  41. if (it.resultCode == Activity.RESULT_OK) {
  42. mPhotoSelectedUri = it.data?.data
  43. with(mBinding) {
  44. btnSelect.visibility = View.INVISIBLE
  45. imgPhoto.setImageURI(mPhotoSelectedUri)
  46. tilTitle.visibility = View.VISIBLE
  47. tvMessage.text = getString(R.string.post_message_valid_title)
  48. }
  49. }
  50. }
  51. private fun openGallery() {
  52. val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
  53. galleryResult.launch(intent)
  54. }
  55. @SuppressLint("SetTextI18n")
  56. private fun postSnapshot() {
  57. mBinding.progressBar.visibility = View.VISIBLE
  58. val key = mDatabaseReferenceRef.push().key!!
  59. val pathString = FirebaseAuth.getInstance().currentUser!!.uid
  60. val storageRef = mStorageReference.child(PATHSNAPSHOT).child(pathString).child(key)
  61. if (mPhotoSelectedUri !== null) {
  62. storageRef.putFile(mPhotoSelectedUri!!)
  63. .addOnProgressListener {
  64. val progress = (100 * it.bytesTransferred / it.totalByteCount).toDouble()
  65. mBinding.progressBar.progress = progress.toInt()
  66. mBinding.tvMessage.text = "$progress%"
  67. }
  68. .addOnCompleteListener {
  69. mBinding.progressBar.visibility = View.INVISIBLE
  70. }
  71. .addOnSuccessListener {
  72. Snackbar.make(mBinding.root, "Instantanea publicada", Snackbar.LENGTH_SHORT).show()
  73. it.storage.downloadUrl.addOnSuccessListener { url ->
  74. saveSnapshot(key, url.toString(), mBinding.etTitle.text.toString())
  75. with(mBinding) {
  76. tilTitle.visibility = View.GONE
  77. tvMessage.text = getString(R.string.select_image_text)
  78. imgPhoto.setImageURI(null)
  79. btnSelect.visibility = View.VISIBLE
  80. }
  81. }
  82. }
  83. .addOnFailureListener {
  84. Snackbar.make(mBinding.root, "Error: ${it.message}", Snackbar.LENGTH_SHORT).show()
  85. }
  86. }
  87. }
  88. private fun saveSnapshot (key: String, url: String, title: String) {
  89. val snapshot = Snapshot(title = title, photoUrl = url)
  90. mDatabaseReferenceRef.child(key).setValue(snapshot)
  91. }
  92. }