Skip to content

Commit 30613f5

Browse files
committed
✨ Data Store에 최초 로그인 시점에 uid, 닉네임, 프로필 이미지 uri 저장
1 parent 6ddeba0 commit 30613f5

File tree

10 files changed

+116
-26
lines changed

10 files changed

+116
-26
lines changed

signin/build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,4 +70,7 @@ dependencies {
7070
// hilt
7171
implementation "com.google.dagger:hilt-android:$hiltVersion"
7272
kapt "com.google.dagger:hilt-compiler:$hiltVersion"
73+
74+
// by viewModels
75+
implementation "androidx.activity:activity-ktx:$activityKtxVersion"
7376
}
Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.whyranoid
22

3-
// class SaveLogInUserInfoUseCase @Inject constructor(
4-
// private val signInRepository: SignInRepository
5-
// ) {
6-
// operator fun invoke(uid: String, nickName: String, profileImgUrl: String): Boolean {
7-
// //return signInRepository.saveLogInUserInfo(uid, nickName, profileImgUrl)
8-
// }
9-
// }
3+
import javax.inject.Inject
4+
5+
class SaveLogInUserInfoUseCase @Inject constructor(
6+
private val signInRepository: SignInRepository
7+
) {
8+
suspend operator fun invoke(userInfo: User): Boolean {
9+
return signInRepository.saveLogInUserInfo(userInfo)
10+
}
11+
}
Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
package com.whyranoid
22

3-
import androidx.datastore.core.DataStore
4-
import androidx.datastore.preferences.core.Preferences
5-
import javax.inject.Inject
6-
7-
class SignInDataSource @Inject constructor(
8-
private val db: DataStore<Preferences>
9-
)
3+
interface SignInDataSource {
4+
suspend fun saveLogInUserInfo(userInfo: User): Boolean
5+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.whyranoid
2+
3+
import androidx.datastore.core.DataStore
4+
import androidx.datastore.preferences.core.Preferences
5+
import androidx.datastore.preferences.core.edit
6+
import androidx.datastore.preferences.core.stringPreferencesKey
7+
import javax.inject.Inject
8+
9+
class SignInDataSourceImpl @Inject constructor(
10+
private val dataStoreDb: DataStore<Preferences>
11+
) : SignInDataSource {
12+
13+
private object PreferenceKeys {
14+
val uid = stringPreferencesKey(UID_KEY)
15+
val nickName = stringPreferencesKey(NICK_NAME_KEY)
16+
val profileImgUrl = stringPreferencesKey(PROFILE_IMG_URI)
17+
}
18+
19+
override suspend fun saveLogInUserInfo(userInfo: User): Boolean {
20+
dataStoreDb.edit { preferences ->
21+
preferences[PreferenceKeys.uid] = userInfo.uid
22+
preferences[PreferenceKeys.nickName] = userInfo.nickName ?: ""
23+
preferences[PreferenceKeys.profileImgUrl] = userInfo.profileImgUri ?: ""
24+
}
25+
return true
26+
}
27+
28+
companion object {
29+
private const val UID_KEY = "uid"
30+
private const val NICK_NAME_KEY = "nick_name"
31+
private const val PROFILE_IMG_URI = "profile_img_uri"
32+
}
33+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.whyranoid
2+
3+
import dagger.Binds
4+
import dagger.Module
5+
import dagger.hilt.InstallIn
6+
import dagger.hilt.components.SingletonComponent
7+
import javax.inject.Singleton
8+
9+
@Module
10+
@InstallIn(SingletonComponent::class)
11+
abstract class SignInModule {
12+
13+
@Binds
14+
@Singleton
15+
abstract fun bindSignInRepository(impl: SignInRepositoryImpl): SignInRepository
16+
17+
@Binds
18+
@Singleton
19+
abstract fun bindSignInDataSource(impl: SignInDataSourceImpl): SignInDataSource
20+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
package com.whyranoid
22

33
interface SignInRepository {
4-
fun saveLogInUserInfo(uid: String, nickName: String, profileImgUrl: String)
4+
suspend fun saveLogInUserInfo(userInfo: User): Boolean
55
}
Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
11
package com.whyranoid
22

3-
class SignInRepositoryImpl()
3+
import javax.inject.Inject
4+
5+
class SignInRepositoryImpl @Inject constructor(private val signInDataSource: SignInDataSource) :
6+
SignInRepository {
7+
8+
override suspend fun saveLogInUserInfo(userInfo: User): Boolean {
9+
return signInDataSource.saveLogInUserInfo(userInfo)
10+
}
11+
}
Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
package com.whyranoid
22

3-
// @HiltViewModel
4-
// class SignInViewModel @Inject constructor(
5-
// private val saveLogInUserInfoUseCase: SaveLogInUserInfoUseCase
6-
// ) : ViewModel() {
7-
// fun saveUserInfo() {
8-
// // saveLogInUserInfoUseCase()
9-
// }
10-
// }
3+
import androidx.lifecycle.ViewModel
4+
import dagger.hilt.android.lifecycle.HiltViewModel
5+
import javax.inject.Inject
6+
7+
@HiltViewModel
8+
class SignInViewModel @Inject constructor(
9+
private val saveLogInUserInfoUseCase: SaveLogInUserInfoUseCase
10+
) : ViewModel() {
11+
suspend fun saveUserInfo(userInfo: User) {
12+
saveLogInUserInfoUseCase(userInfo)
13+
}
14+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.whyranoid
2+
3+
data class User(
4+
val uid: String,
5+
val nickName: String?,
6+
val profileImgUri: String?
7+
)

signin/src/main/java/com/whyranoid/signin/SignInActivity.kt

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@ import android.content.Intent
44
import android.os.Bundle
55
import androidx.activity.result.ActivityResultLauncher
66
import androidx.activity.result.contract.ActivityResultContracts
7+
import androidx.activity.viewModels
78
import androidx.appcompat.app.AppCompatActivity
89
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
910
import androidx.databinding.DataBindingUtil
11+
import androidx.lifecycle.lifecycleScope
1012
import com.google.android.gms.auth.api.signin.GoogleSignIn
1113
import com.google.android.gms.auth.api.signin.GoogleSignInAccount
1214
import com.google.android.gms.auth.api.signin.GoogleSignInOptions
@@ -17,15 +19,21 @@ import com.google.firebase.auth.FirebaseAuth
1719
import com.google.firebase.auth.GoogleAuthProvider
1820
import com.google.firebase.auth.ktx.auth
1921
import com.google.firebase.ktx.Firebase
22+
import com.whyranoid.SignInViewModel
23+
import com.whyranoid.User
2024
import com.whyranoid.presentation.MainActivity
2125
import com.whyranoid.signin.databinding.ActivitySignInBinding
2226
import dagger.hilt.android.AndroidEntryPoint
23-
import timber.log.Timber
27+
import kotlinx.coroutines.launch
2428

2529
@AndroidEntryPoint
2630
class SignInActivity : AppCompatActivity() {
2731
private lateinit var binding: ActivitySignInBinding
2832
private lateinit var auth: FirebaseAuth
33+
private var uid: String? = null
34+
private var nickName: String? = null
35+
private var profileImgUri: String? = null
36+
private val viewModel by viewModels<SignInViewModel>()
2937

3038
// 구글 로그인 클라이언트 객체
3139
private val googleSignInClient by lazy {
@@ -50,7 +58,8 @@ class SignInActivity : AppCompatActivity() {
5058
account.idToken?.let { idToken ->
5159
signInWithGoogle(idToken)
5260
// 데이터 스토어에 유저 정보 저장
53-
Timber.d("닉네임 : ${account.displayName} 프로필 사진 주소 : ${account.photoUrl}")
61+
nickName = account.displayName
62+
profileImgUri = account.photoUrl.toString()
5463
}
5564
} catch (e: ApiException) {
5665
Snackbar.make(
@@ -110,6 +119,14 @@ class SignInActivity : AppCompatActivity() {
110119
getString(R.string.sign_in_success),
111120
Snackbar.LENGTH_SHORT
112121
).show()
122+
123+
uid = auth.uid
124+
lifecycleScope.launch {
125+
uid?.let {
126+
viewModel.saveUserInfo(User(it, nickName, profileImgUri))
127+
}
128+
}
129+
113130
startActivity(intent)
114131
} else {
115132
Snackbar.make(

0 commit comments

Comments
 (0)