package com.example.snapshots import android.annotation.SuppressLint import android.app.Activity import android.content.Intent import android.net.Uri import android.os.Bundle import android.provider.MediaStore import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.activity.result.contract.ActivityResultContracts import com.example.snapshots.databinding.FragmentAddBinding import com.google.android.material.snackbar.Snackbar import com.google.firebase.auth.FirebaseAuth import com.google.firebase.database.DatabaseReference import com.google.firebase.database.FirebaseDatabase import com.google.firebase.storage.FirebaseStorage import com.google.firebase.storage.StorageReference class AddFragment : Fragment() { private lateinit var mBinding: FragmentAddBinding private val PATHSNAPSHOT = "snapshots" private lateinit var mStorageReference: StorageReference private lateinit var mDatabaseReferenceRef: DatabaseReference private var mPhotoSelectedUri: Uri? = null override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { mBinding = FragmentAddBinding.inflate(inflater, container, false) return mBinding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) mBinding.btnPost.setOnClickListener { postSnapshot() } mBinding.btnSelect.setOnClickListener { openGallery() } mStorageReference = FirebaseStorage.getInstance().reference mDatabaseReferenceRef = FirebaseDatabase.getInstance().reference.child(PATHSNAPSHOT) // Obtiene el nodo "snapshot" } private val galleryResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { if (it.resultCode == Activity.RESULT_OK) { mPhotoSelectedUri = it.data?.data with(mBinding) { btnSelect.visibility = View.INVISIBLE imgPhoto.setImageURI(mPhotoSelectedUri) tilTitle.visibility = View.VISIBLE tvMessage.text = getString(R.string.post_message_valid_title) } } } private fun openGallery() { val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI) galleryResult.launch(intent) } @SuppressLint("SetTextI18n") private fun postSnapshot() { mBinding.progressBar.visibility = View.VISIBLE val key = mDatabaseReferenceRef.push().key!! val pathString = FirebaseAuth.getInstance().currentUser!!.uid val storageRef = mStorageReference.child(PATHSNAPSHOT).child(pathString).child(key) if (mPhotoSelectedUri !== null) { storageRef.putFile(mPhotoSelectedUri!!) .addOnProgressListener { val progress = (100 * it.bytesTransferred / it.totalByteCount).toDouble() mBinding.progressBar.progress = progress.toInt() mBinding.tvMessage.text = "$progress%" } .addOnCompleteListener { mBinding.progressBar.visibility = View.INVISIBLE } .addOnSuccessListener { Snackbar.make(mBinding.root, "Instantanea publicada", Snackbar.LENGTH_SHORT).show() it.storage.downloadUrl.addOnSuccessListener { url -> saveSnapshot(key, url.toString(), mBinding.etTitle.text.toString()) with(mBinding) { tilTitle.visibility = View.GONE tvMessage.text = getString(R.string.select_image_text) imgPhoto.setImageURI(null) btnSelect.visibility = View.VISIBLE } } } .addOnFailureListener { Snackbar.make(mBinding.root, "Error: ${it.message}", Snackbar.LENGTH_SHORT).show() } } } private fun saveSnapshot (key: String, url: String, title: String) { val snapshot = Snapshot(title = title, photoUrl = url) mDatabaseReferenceRef.child(key).setValue(snapshot) } }