결과 :
4번째 줄에 보면 7자리수로 유저코드가 생성된 것이 보입니다. 이것을 만들고, 파이어베이스에 저장하는거까지 해봅시다.
저는 이것의 코드가 길어지고, 구글 로그인 / 일반 로그인 이렇게 두 군데로 제작했기 때문에 유틸로 제작, static 함수로 관리하지만, 앱 상황에 따라 유동적으로 조절하셔도 됩니다.
예시로 Firebase 구글 로그인부터 봅니다.
저는 이것을 액티비티에서 buttonListener 로 매서드를 호출합니다. 이걸 보러 올 정도면 이 정도는 할 수 있다 생각합니다!
- LoginActivity.java
private FirebaseAuth firebaseAuth;
private void initGoogleLogin() {
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();
googleSignInClient = GoogleSignIn.getClient(this, gso);
firebaseAuth = FirebaseAuth.getInstance();
db = FirebaseFirestore.getInstance();
}
private void setListener() {
googleSignInButton.setOnClickListener(v -> {
DlogUtil.d(TAG, "googleSignInButton 클릭");
signIn();
});
}
private void signIn() {
Intent signInIntent = googleSignInClient.getSignInIntent();
startActivityForResult(signInIntent, RC_SIGN_IN);
}
private void firebaseAuthGoogle(String idToken) {
showProgressBar();
AuthCredential credential = GoogleAuthProvider.getCredential(idToken, null);
firebaseAuth.signInWithCredential(credential).addOnCompleteListener(this, task -> {
if (task.isSuccessful()) {
DlogUtil.d(TAG, "로그인 성공");
//로그인 이력을 확인합니다.
LoginUtil.checkLogin();
LoginActivity.this.finish();
} else {
DlogUtil.d(TAG, "로그인 실패");
Toast.makeText(LoginActivity.this, "로그인 실패", Toast.LENGTH_SHORT).show();
}
hideProgressBar();
});
}
처음 액티비티를 통해 로그인을 하고, checkLogin을 이용해 이전에 로그인을 한 적이 있는 메일인지 확인합니다.
이제 만들어둔 LoginUtil을 사용합니다.
private static FirebaseFirestore db;
private static FirebaseAuth firebaseAuth;
private static void initGoogleLogin() {
firebaseAuth = FirebaseAuth.getInstance();
db = FirebaseFirestore.getInstance();
}
먼저 다음과 같은 전역변수와, 파이어베이스 변수에 값을 초기화 해줍니다.
그리고, 처음 로그인 이력을 확인합니다.
public static void checkLogin() {
DlogUtil.d(TAG, "checkLogin");
initGoogleLogin();
HashMap<Object, Object> hashMap = new HashMap<>();
db.collection("user")
.whereEqualTo("email", firebaseAuth.getCurrentUser().getEmail())
.get()
.addOnCompleteListener(task -> {
if (task.isSuccessful()) {
DlogUtil.d(TAG, "성공 : 여기로 오나?");
for (QueryDocumentSnapshot documentSnapshot : task.getResult()) {
hashMap.put("code", documentSnapshot.getData().containsKey("code"));
}
if (hashMap.isEmpty()) {
//코드를 생성하고, 코드가 있는지 재확인한다.
makeUserCode();
}
} else {
DlogUtil.d(TAG, "실패 : 여기로 오나?");
}
})
.addOnFailureListener(e -> {
DlogUtil.d(TAG, "여기니..?");
e.printStackTrace();
});
}
실제로 로그인한 이력을 확인하고, 로그인 이력이 있다면 HashMap 내부에 결과값을 삽입합니다.
만약 HashMap이 비었다면 이전에 로그인 한 적이 없다는 뜻이겠죠? 그러니 코드를 발급합니다.
private static void makeUserCode() {
DlogUtil.d(TAG, "makeUserCode");
HashMap<String, Object> hashMap = new HashMap<>();
int code = (int) (Math.random() * 10000000);
db.collection("user")
.whereEqualTo("code", code)
.get()
.addOnCompleteListener(task -> {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot documentSnapshot : task.getResult()) {
DlogUtil.d(TAG, documentSnapshot.getData());
hashMap.put("code", documentSnapshot.getData().containsValue("code"));
}
if (hashMap.isEmpty()) {
giveUserCode(code);
} else {
makeUserCode();
}
} else {
DlogUtil.d(TAG, "실패");
makeUserCode();
}
})
.addOnFailureListener(e -> {
e.printStackTrace();
DlogUtil.d(TAG, "실패");
makeUserCode();
});
}
이번에는 난수로 코드를 선으로 만들고, 코드는 겹치면 안되는 고유의 값이기 때문에(파이어베이스가 기반하는 NoSQL은 고유키나 후보키 등이 존재하지 않습니다.), 먼저 결과값을 돌려보고, 결과를 다시 해시맵에 넣어봅니다. 해시맵이 비었다면, 이전에 이 코드가 만들어진 적이 없다는 뜻이므로, 유저코드를 삽입하는 함수를 실행하고, 그런 적이 없다면 makeUserCode 함수를 재호출 합니다.
이제 고유값 코드를 파이어베이스에 집어넣습니다.
private static void giveUserCode(int code) {
DlogUtil.d(TAG, "giveUserCode");
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("email", firebaseAuth.getCurrentUser().getEmail());
hashMap.put("username", firebaseAuth.getCurrentUser().getDisplayName());
hashMap.put("code", code);
db.collection("user").document(firebaseAuth.getCurrentUser().getEmail())
.set(hashMap)
.addOnSuccessListener(aVoid -> DlogUtil.d(TAG, "성공 : " + hashMap.get("code")))
.addOnFailureListener(e -> {
e.printStackTrace();
DlogUtil.d(TAG, "실패");
});
}
만들어진 코드를 해시맵에 넣고, 그 해시맵을 set해서 값을 부여합니다. 그러면 파이어베이스에 짜쟌, 값이 저장됩니다.
'Project > 안드로이드 프로젝트(HomingBird)' 카테고리의 다른 글
Android Studio, Java ] Edit text color 변경(밑줄, 커서, 하이라이트 등) (0) | 2020.11.24 |
---|---|
Android Studio, JAVA, Google Firebase] 한번의 매서드로, 세 개의 쿼리를 처리하기 (0) | 2020.11.10 |
Android Studio, JAVA] Material Design / Drawer Navigation에서, 기기에 따라 동적으로 메뉴를 가운데 두는 방법 (0) | 2020.11.09 |
Android Studio, JAVA, Kotlin ] Debug Log를 찍는 Util (0) | 2020.11.06 |
HomingBird Project 0. 개요. (0) | 2020.11.06 |