Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[#118]산책 시작부터 시간,거리 계산/내 현재 위치 실시간 업데이트/산책기록(리뷰 포함) db에 업로드 #116

Merged
merged 3 commits into from
Sep 20, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions app/src/main/java/com/petpal/mungmate/model/WalkRecord.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.petpal.mungmate.model

data class WalkRecord(
val walkRecorduid:String, //산책 기록자 uid
val walkRecordDate:String, //기록한 날짜
val walkRecordStartTime:String, //시작시간
val walkRecordEndTime:String, //종료시간
val walkDuration:String, //소요시간
val walkDistance:Double, //거리
val walkMatchingId:String?=null, //산책 상대 uid
val walkMemo:String, //메모
val walkPhoto:String?=null //사진

)
163 changes: 163 additions & 0 deletions app/src/main/java/com/petpal/mungmate/ui/WalkReviewWriteFragment.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
package com.petpal.mungmate.ui

import android.app.Activity
import android.content.Intent
import android.graphics.Bitmap
import android.net.Uri
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.fragment.app.Fragment
import com.bumptech.glide.Glide
import com.bumptech.glide.request.target.SimpleTarget
import com.bumptech.glide.request.transition.Transition
import com.google.android.material.snackbar.Snackbar
import com.google.firebase.auth.ktx.auth
import com.google.firebase.firestore.FieldValue
import com.google.firebase.firestore.FirebaseFirestore
import com.google.firebase.ktx.Firebase
import com.google.firebase.storage.FirebaseStorage
import com.petpal.mungmate.MainActivity

import com.petpal.mungmate.R
import com.petpal.mungmate.databinding.FragmentWalkReviewWriteBinding
import com.petpal.mungmate.model.Place
import com.petpal.mungmate.model.Review
import com.petpal.mungmate.model.WalkRecord
import com.petpal.mungmate.ui.placereview.WritePlaceReviewFragment
import java.io.ByteArrayOutputStream
import java.util.UUID


class WalkReviewWriteFragment : Fragment() {
private lateinit var fragmentWalkReviewWriteBinding: FragmentWalkReviewWriteBinding
private lateinit var mainActivity: MainActivity
private val db = FirebaseFirestore.getInstance()
private val storage = FirebaseStorage.getInstance()
private var selectedImageUri: Uri? = null
private val auth = Firebase.auth
private lateinit var userId:String




override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
fragmentWalkReviewWriteBinding= FragmentWalkReviewWriteBinding.inflate(layoutInflater)
mainActivity=activity as MainActivity

val user=auth.currentUser
userId=user!!.uid
val walkRecorduid=arguments?.getString("walkRecorduid")
val walkRecordDate=arguments?.getString("walkRecordDate")
val walkRecordStartTime=arguments?.getString("walkRecordStartTime")
val walkRecordEndTime=arguments?.getString("walkRecordEndTime")
val walkDuration=arguments?.getString("walkDuration")
val walkDistance=arguments?.getString("walkDistance")
val walkMatchingId=arguments?.getString("walkMatchingId")

fragmentWalkReviewWriteBinding.imageViewWalk.setOnClickListener {
selectImageFromGallery()
}

fragmentWalkReviewWriteBinding.buttonWalkReviewSubmit.setOnClickListener {
val walkMemo=fragmentWalkReviewWriteBinding.editTextWalkContent.text.toString()
val walkPhoto=selectedImageUri
if (walkPhoto != null) {
uploadImageToStorage(walkPhoto) { walkPhoto ->
val walkReview=WalkRecord(walkRecorduid!!,walkRecordDate!!,walkRecordStartTime!!,walkRecordEndTime!!,walkDuration!!,walkDistance!!.toDouble(),walkMatchingId,
walkMemo,walkPhoto)
addWalkReview(userId,walkReview)
// 리뷰 등록 후 Navigation 이동
mainActivity.navigate(R.id.action_WriteWalkReviewFragment_to_mainFragment)
}
}
}


return fragmentWalkReviewWriteBinding.root
}

fun addWalkReview(userId: String, walkReview: WalkRecord) {
val userRef = db.collection("users").document(userId)

userRef.update("walkRecordList", FieldValue.arrayUnion(walkReview))
.addOnSuccessListener {
Toast.makeText(context, "리뷰가 성공적으로 등록되었습니다.", Toast.LENGTH_SHORT).show()
}
.addOnFailureListener { e ->

Toast.makeText(context, "리뷰 등록 실패 .", Toast.LENGTH_SHORT).show()
}
}



private fun selectImageFromGallery() {
val intent = Intent(Intent.ACTION_PICK)
intent.type = "image/*"
startActivityForResult(intent, IMAGE_PICK_CODE1)
}


override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)

if (resultCode == Activity.RESULT_OK && requestCode == IMAGE_PICK_CODE1) {
selectedImageUri = data?.data
fragmentWalkReviewWriteBinding.imageViewWalk.setImageURI(selectedImageUri)
}
}

private fun uploadImageToStorage(uri: Uri, onSuccess: (String) -> Unit) {
showProgress()

Glide.with(this)
.asBitmap()
.load(uri)
.override(400, 400)
.into(object : SimpleTarget<Bitmap>() {
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
val byteArrayOutputStream = ByteArrayOutputStream()
resource.compress(Bitmap.CompressFormat.JPEG, 80, byteArrayOutputStream)
val byteArray = byteArrayOutputStream.toByteArray()

val ref = storage.reference.child("reviews/${UUID.randomUUID()}.jpg")
ref.putBytes(byteArray)
.addOnSuccessListener {
ref.downloadUrl.addOnSuccessListener {
hideProgress()
onSuccess(it.toString())
//showSnackbar("리뷰가 성공적으로 등록되었습니다.")
Toast.makeText(context, "리뷰가 성공적으로 등록되었습니다.", Toast.LENGTH_SHORT).show()
}
}
.addOnFailureListener {
fragmentWalkReviewWriteBinding.progressBarWalk.visibility = View.GONE
Toast.makeText(context, "이미지 업로드 실패", Toast.LENGTH_SHORT).show()
}
}
})
}

private fun showSnackbar(message: String) {
Snackbar.make(fragmentWalkReviewWriteBinding.root, message, Snackbar.LENGTH_SHORT).show()
}
fun showProgress() {
fragmentWalkReviewWriteBinding.progressBarWalk.visibility = View.VISIBLE
fragmentWalkReviewWriteBinding.progressBackgroundWalk.visibility = View.VISIBLE
}

fun hideProgress() {
fragmentWalkReviewWriteBinding.progressBarWalk.visibility = View.GONE
fragmentWalkReviewWriteBinding.progressBackgroundWalk.visibility = View.GONE
}
companion object {
private const val IMAGE_PICK_CODE1 = 1000
}

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.petpal.mungmate.ui.placereview

import android.app.AlertDialog
import android.app.Dialog
import android.content.Context
import android.os.Bundle
import android.util.Log
Expand Down Expand Up @@ -147,17 +149,25 @@ class PlaceReviewFragment : Fragment() {
bundle.putString("reviewImageURL", review.imageRes)
bundle.putString("placeId",placeId)
mainActivity.navigate(R.id.action_placeReviewFragment_to_placeReviewModifyFragment,bundle)
// Toast.makeText(holder.itemView.context, "Modify clicked for position $position", Toast.LENGTH_SHORT).show()
}

holder.placeReviewDelete.setOnClickListener {
viewModel.deleteReviewForPlace(placeId, reviewId)
val builder = AlertDialog.Builder(it.context)
builder.setTitle("멍메이트")
builder.setMessage("정말로 이 리뷰를 삭제하시겠습니까?")
builder.setPositiveButton("확인") { dialog, _ ->
viewModel.deleteReviewForPlace(placeId, reviewId)
dialog.dismiss()
}
builder.setNegativeButton("취소") { dialog, _ ->
dialog.dismiss()
}
builder.create().show()
}
}

override fun getItemCount(): Int = reviews.size

// This function updates the reviews list and notifies the RecyclerView of the changes
fun updateReviews(newReviews: List<Review>) {
reviews = newReviews
notifyDataSetChanged()
Expand Down
Loading