
개요
연인을 위해 또는 가족, 친구를 위해 꽃을 사는데
카카오맵, 네이버지도에는 운영시간과 전화번호가 없는 곳은 태반이며
왜 여러 곳을 방문하며 꽃을 찾을까요?
운영 중이라도 꽃이 없다면 헛걸음과 시간이 소비되는데
점주가 직접 운영시간과 상호명, 전화번호 그리고
꽃의 재고를 등록하자!
그래서 만들려고 합니다 꽃밭.app
구현해야 할 것
공통사항
·회원가입
(ID, PW, Nick Name, Store name
OpenDay, Time, Address)
·로그인
유저 시점
· 내 정보 보기
· 지도
· 점주 리스트 확인
점주 시점
· 사진 추가
· 매장 정보(운영시간, 꽃재고, 점포 번호)
오늘 한 구현
회원가입 및 로그인 (Firebase)
결과화면
버튼 눌렀을 시 화면전환 구현 (점주, 회원, 로그인)
private fun buttonClickEvent() = with(binding) {
registerOwnerButton.setOnClickListener {
val intent = Intent(this@StartActivity, JoinOwner::class.java)
startActivity(intent)
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out)
}
registerUserButton.setOnClickListener {
val intent = Intent(this@StartActivity, JoinUser::class.java)
startActivity(intent)
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out)
}
loginButton.setOnClickListener {
val intent = Intent(this@StartActivity, Login::class.java)
startActivity(intent)
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out)
}
}
유저 회원가입 구현
package com.project.flowergarden
import android.animation.ObjectAnimator
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.provider.ContactsContract.Data
import android.text.Editable
import android.text.TextWatcher
import android.util.Log
import android.view.View
import android.widget.Toast
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.database.*
import com.project.flowergarden.databinding.ActivityJoinUserBinding
import com.project.flowergarden.entity.OwnerEntity
import com.project.flowergarden.entity.UserEntity
class JoinUser : AppCompatActivity() {
private lateinit var binding: ActivityJoinUserBinding
private var auth: FirebaseAuth? = null //파이어베이스 인증
var check = false
var check2 = false
var check3 = false
var check4 = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityJoinUserBinding.inflate(layoutInflater)
setContentView(binding.root)
seekBar()
backButtonClicked()
checkinit()
joinUserinit()
auth = FirebaseAuth.getInstance()
}
private fun seekBar() {
ObjectAnimator.ofInt(binding.seekBar, "progress", 30).start()
binding.seekBar.isEnabled = false
}
private fun backButtonClicked() = with(binding) {
backButton.setOnClickListener {
val intent = Intent(this@JoinUser, StartActivity::class.java)
startActivity(intent)
}
}
private fun checkinit() = with(binding) {
joinUserButton.isEnabled = false
emailEditTextView.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
check = false
regectbutton()
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
if (s!!.contains("@", ignoreCase = true) && s.contains(".com", ignoreCase = true)) {
emailCheckTextView.visibility = View.GONE
check = true
ObjectAnimator.ofInt(seekBar, "progress",60).start()
if(check2 && check3 && check4) {
permitbutton()
}
} else {
emailCheckTextView.visibility = View.VISIBLE
check = false
regectbutton()
}
Log.d("결과1", "$s")
}
override fun afterTextChanged(s: Editable?) {
val result1 = emailEditTextView.text.toString()
if(result1.isEmpty()) {
check = false
regectbutton()
}
}
})
passwordEditTextView.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
check2 = false
regectbutton()
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
if (s!!.length < 8) {
lengthCheckTextView.visibility = View.VISIBLE
check2 = false
regectbutton()
} else {
lengthCheckTextView.visibility = View.GONE
check2 = true
ObjectAnimator.ofInt(seekBar, "progress",80).start()
if(check && check3 && check4) {
permitbutton()
}
}
}
override fun afterTextChanged(s: Editable?) {
val result2 = emailEditTextView.text.toString()
if(result2.isEmpty()) {
check2 = false
regectbutton()
}
if (s!!.length < 8) {
lengthCheckTextView.visibility = View.VISIBLE
check2 = false
regectbutton()
} else {
lengthCheckTextView.visibility = View.GONE
check2 = true
ObjectAnimator.ofInt(seekBar, "progress",80).start()
if(check && check3 && check4) {
permitbutton()
}
}
if (passwordEditTextView.text.toString() == passwordCheckEditTextView.text.toString() && result2.length < 9) {
resultCheckTextView.visibility = View.GONE
check3 = true
ObjectAnimator.ofInt(seekBar, "progress",100).start()
if(check && check2 && check4) {
permitbutton()
}
} else {
resultCheckTextView.visibility = View.VISIBLE
check3 = false
}
}
})
passwordCheckEditTextView.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
check3 = false
regectbutton()
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
}
override fun afterTextChanged(s: Editable?) {
if (passwordEditTextView.text.toString() == passwordCheckEditTextView.text.toString()) {
resultCheckTextView.visibility = View.GONE
check3 = true
ObjectAnimator.ofInt(seekBar, "progress",100).start()
if(check && check2 && check4) {
permitbutton()
}
} else {
resultCheckTextView.visibility = View.VISIBLE
check3 = false
regectbutton()
}
}
})
nickNAmeEditTextView.addTextChangedListener(object: TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
check4 = false
regectbutton()
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
}
override fun afterTextChanged(s: Editable?) {
val result = nickNAmeEditTextView.text.toString()
nickNameCheckTextView.visibility = View.VISIBLE
if(result.isNotEmpty() && result.length >= 2) {
check4 = true
nickNameCheckTextView.visibility = View.GONE
if(check && check2 && check3) {
nickNameCheckTextView.visibility = View.GONE
permitbutton()
}
}
if(result.isEmpty() && result.length < 2) {
nickNameCheckTextView.visibility = View.VISIBLE
check4 = false
regectbutton()
}
}
})
}
private fun permitbutton() = with(binding) {
joinUserButton.setBackgroundDrawable(resources.getDrawable(R.drawable.shape_register))
joinUserButton.isEnabled = true
}
private fun regectbutton() = with(binding) {
joinUserButton.setBackgroundDrawable(resources.getDrawable(R.drawable.shape_regect))
joinUserButton.isEnabled = false
}
private fun joinUserinit() = with(binding) {
joinUserButton.setOnClickListener {
ObjectAnimator.ofInt(seekBar, "progress",150).start()
progressBar.visibility = View.VISIBLE
val email = emailEditTextView.text.toString()
val password = passwordEditTextView.text.toString()
val nickname = nickNAmeEditTextView.text.toString()
auth!!.createUserWithEmailAndPassword(email, password).addOnCompleteListener { Task ->
//성공하면!
if(Task.isSuccessful) {
//OwnerEntity 데이터 클래스의 값 추가하기
val user = UserEntity(email, password, nickname)
Log.d("회원가입", "회원가입 성공")
//아이디 비번 점주명 주소 값 설정 한 값의 경로 지정!
FirebaseDatabase.getInstance().getReference("User")
.child(FirebaseAuth.getInstance().currentUser!!.uid)
.setValue(user).addOnCompleteListener {
Toast.makeText(this@JoinUser, "환영합니다! \n ${nickname}님!!", Toast.LENGTH_SHORT).show()
progressBar.visibility = View.GONE
val intent = Intent(this@JoinUser, StartActivity::class.java)
overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out)
startActivity(intent)
}
} else{
Log.e("가입결과","${Task.exception?.message}")
when(Task.exception?.message) {
"The email address is badly formatted." -> {
progressBar.visibility = View.GONE
Toast.makeText(this@JoinUser,"이메일 형식으로 입력하시오.", Toast.LENGTH_SHORT).show()
emailEditTextView.text = null
return@addOnCompleteListener
}
"The given password is invalid. [ Password should be at least 6 characters ]" -> {
progressBar.visibility = View.GONE
Toast.makeText(this@JoinUser,"비밀번호는 8자리 이상입니다.", Toast.LENGTH_SHORT).show()
passwordCheckEditTextView.text = null
passwordEditTextView.text = null
return@addOnCompleteListener
}
"The email address is already in use by another account." -> {
progressBar.visibility = View.GONE
Toast.makeText(this@JoinUser,"이미 존재하는 이메일입니다.", Toast.LENGTH_SHORT).show()
emailEditTextView.text = null
return@addOnCompleteListener
}
}
}
}
}
}
}
UserEntity.kt
data class UserEntity (
val email: String,
val password: String,
val nickname: String
)
'Android-Kotlin📱' 카테고리의 다른 글
[Android/Kotlin] 로그인 시 두 액티비티 구별 Firebase Realtime Database (0) | 2022.05.22 |
---|---|
Kotlin Fragment ViewBinding (0) | 2022.05.21 |
Android Studio Wireless Debugging (안드로이드 스튜디오 무선디버깅) (0) | 2022.05.20 |
안드로이드 코틀린, 자바 AppCompat (0) | 2022.05.18 |
Kotlin 숫자 구별을 위한 확장함수(Extension Function) (0) | 2022.05.17 |