앞서 말한 것처럼 DirectTalk9를 참고하여 채팅방을 만들 것이다.
이하 [기반 앱] 이라고 지칭한 것은 DirectTalk9을 의미한다.
(1)을 요약하면, DirectTalk9를 일단 checkout해서 실행해본 뒤,
코틀린 프로젝트를 새로 생성하여 파이어베이스와 연결만 해둔 상태이다.
새로 생성한 코틀린 프로젝트에 위 코드를 분석하여 모듈들을 만들 예정이다.
일단 파이어베이스 로그인 부터 구현하기 위해 module:app의 디펜던시에 아래와 같이 파이어 베이스 auth를 implement해 주었다.
그리고 기반앱에서 Login Activity.java와 activity_login.xml 을 복사한뒤 코틀린 파일로 자동 변환하였다.
임플멘테이션을 한뒤,
로그인 액티비티 파일의 변환과정에서 FirebaseAuth가 빨간줄인데 alt+enter를 누르면 디펜던시를 추가할수 있다.
그러면 Firebase에서 제공하는 AuthResult도 import할 수 있다.
로그인 버튼 이벤트 콜벡부분은 onCreate로 옮긴뒤 return으로 되어있는 부분에 대해서는 아래와 같은 코드로 바꾸었다.
위 코드에서 onComplete 부분은 오버라이딩 되어야하므로 fun 앞에 override 키워드를 추가해주고,
OnCompleteListener<AuthResult>() 부분에서는 constructor가 없으니 ()를 지워준다.
그러면 object를 람다형식으로 바꿔주라는 recommendation이 나오는데 이때 object 근처에 커서를 갖다대고 alt+enter를 누르면 람다형식으로 코드를 변환할 수 있다.
위와 같은 추천 레코멘데이션도 alt + enter로 변환해주고... 하면
아래는 그 결과이다.
여기 Util9은 조금 있다가 정리하도록하고, signupClick도 마찬가지 방법으로 정리해준다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
signupBtn.setOnClickListener {
if (validateForm()) {
val id = user_id!!.text.toString()
FirebaseAuth.getInstance()
.createUserWithEmailAndPassword(id, user_pw!!.text.toString())
.addOnCompleteListener { task ->
if (task.isSuccessful) {
val uid = FirebaseAuth.getInstance().uid
val userModel = UserModel()
userModel.setUserid(id)
userModel.setUsernm(extractIDFromEmail(id))
userModel.setUsermsg("...")
val db = FirebaseFirestore.getInstance()
db.collection("users").document(uid!!)
.set(userModel)
.addOnSuccessListener {
val intent =
Intent(this@LoginActivity, MainActivity::class.java)
startActivity(intent)
finish()
Log.e("로그인액티비티 버그체크","DocumentSnapshot added with ID: $uid")
}
} else {
Util9.showMessage(
applicationContext,
task.exception.getMessage()
)
}
}
}
}
|
위는 사인업 버튼 이벤트 콜벡 부분을 코틀린으로 바꾼 것이다.
이제 UserModel 부분과 Util9 부분을 가져와서 헬퍼메소드들을 구현해보자.
코틀린은 Static Class 대신 Object를 사용해서 바로 singleton pattern을 만들 수 있으므로
자동변환시 나오는 internal val instance = Util9() 이 부분은 삭제한다.
자동변환하면 아래 부분만 문제가 생기는데 이는 filesize가 null 허용이기 때문이다. 이를 처리해준다.
본인은 들어오는 Long? 변수를 Long으로 바꾸었다.
위 부분은 message로 바꿔주고 String? 을 String으로 바꿔주는 작업을 아래와 같이 해준다.
이제 남은 것은 UserModel()을 가져오는 것이다.
코드를 보았더니 위와 같다. 이는 코틀린의 Dataclass로 접근자 get, set을 정의할 수 있으므로 아래와 같이 바꾸어주었다.
코드 자동변환만 해주면 위와 같이 알아서 잘 바꾸어주었기에... 널처리에 대한 고민만 잠시 하면되겠다.
저렇게 변환하고 login activity에 import 하면
아래와 같은 문제가 다시 생긴다.
아래와 같이 필드 접근에 대해서는 코틀린 스타일로 바꿔주면된다.