Skip to content

Commit

Permalink
[FEATURE] #75 약관동의 화면 구현 (#79)
Browse files Browse the repository at this point in the history
* [REFACTOR] #75 accessToken -> idToken으로 수정

* [BASE] #75 약관동의 모듈 생성

* [UI] #75 약관동의 UI 구현

* [BASE] #75 dimens 적용

* [FEATURE] #75 다크모드 제한

* [UI] #75 레이아웃 수정

* [FEATURE] #75 UI 로직 구현

* [REFACTOR] #75 약관동의 로직 연동

* [FEATURE] #75 약관동의 로직 수정

* [REFACTOR] #75 ktlint 반영

* [REFACTOR] #75 ktlint 반영
  • Loading branch information
jiwon2724 authored Jul 21, 2023
1 parent b407add commit be2b7af
Show file tree
Hide file tree
Showing 15 changed files with 339 additions and 8 deletions.
3 changes: 2 additions & 1 deletion app/src/main/java/com/peonlee/PeonleeApplication.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,15 @@
package com.peonlee

import android.app.Application
import androidx.appcompat.app.AppCompatDelegate
import com.kakao.sdk.common.KakaoSdk
import dagger.hilt.android.HiltAndroidApp

@HiltAndroidApp
class PeonleeApplication : Application() {
override fun onCreate() {
super.onCreate()

KakaoSdk.init(this, BuildConfig.KAKAO_NATIVE_KEY)
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/brand30" />
<stroke
android:width="@dimen/outline_stroke_width"
android:color="@color/brand60" />
<corners android:radius="@dimen/radius_10dp" />
</shape>
1 change: 1 addition & 0 deletions feature/login/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ dependencies {
implementation(project(":core:data"))

implementation(project(":feature:main"))
implementation(project(":feature:terms"))

implementation(platform(libs.firebase.bom))
implementation(libs.firebase.analytics)
Expand Down
25 changes: 22 additions & 3 deletions feature/login/src/main/java/com/peonlee/login/LoginActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import com.kakao.sdk.common.model.ClientErrorCause
import com.kakao.sdk.user.UserApiClient
import com.peonlee.core.ui.base.BaseActivity
import com.peonlee.core.ui.extensions.showToast
import com.peonlee.feature.terms.TermsActivity
import com.peonlee.login.databinding.ActivityLoginBinding
import com.peonlee.main.MainActivity
import dagger.hilt.android.AndroidEntryPoint
Expand All @@ -29,6 +30,11 @@ class LoginActivity : BaseActivity<ActivityLoginBinding>() {
googleSignInResult(activityResult)
}

private val agreeTermsLauncher: ActivityResultLauncher<Intent> =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { activityResult ->
termsResult(activityResult)
}

private val loginViewModel: LoginViewModel by viewModels()

override fun bindingFactory() = ActivityLoginBinding.inflate(layoutInflater)
Expand All @@ -48,9 +54,11 @@ class LoginActivity : BaseActivity<ActivityLoginBinding>() {
is LoginState.Success -> {
loginViewModel.setToken(loginState.data.accessToken)
startActivity(Intent(this@LoginActivity, MainActivity::class.java))
finish()
}
is LoginState.Already -> {
// TODO : 약관 화면 이동
is LoginState.NotRegistered -> {
val intent = Intent(this@LoginActivity, TermsActivity::class.java)
agreeTermsLauncher.launch(intent)
}
is LoginState.Fail -> showToast(R.string.server_error)
}
Expand Down Expand Up @@ -99,7 +107,11 @@ class LoginActivity : BaseActivity<ActivityLoginBinding>() {
}
loginWithKakaoAccount()
}
token != null -> loginViewModel.login(token.accessToken, "KAKAO")
token != null -> {
token.idToken?.let { idToken ->
loginViewModel.login(idToken, "KAKAO")
} ?: showToast(R.string.invalid_token)
}
}
}
} else {
Expand All @@ -116,4 +128,11 @@ class LoginActivity : BaseActivity<ActivityLoginBinding>() {
}
return UserApiClient.instance.loginWithKakaoAccount(this, callback = kakaoLoginCallback)
}

private fun termsResult(activityResult: ActivityResult) {
when (activityResult.resultCode) {
Activity.RESULT_OK -> loginViewModel.signUp()
else -> Unit
}
}
}
17 changes: 13 additions & 4 deletions feature/login/src/main/java/com/peonlee/login/LoginViewModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -21,19 +21,28 @@ class LoginViewModel @Inject constructor(
private val dataStore: LocalDataSource
) : ViewModel() {

var loginType: String = ""
private set

var loginToken: String = ""
private set

private val _loginState: MutableSharedFlow<LoginState> = MutableStateFlow(LoginState.Init)
val loginState = _loginState.asSharedFlow()

fun login(token: String, type: String) {
loginType = type
loginToken = token

viewModelScope.launch {
val loginResult = loginUseCase.login(token, setRequest(token, type))
handleState(loginResult)
}
}

fun signUp(token: String, type: String) {
fun signUp() {
viewModelScope.launch {
val signUpResult = loginUseCase.signUp(token, setRequest(token, type))
val signUpResult = loginUseCase.signUp(loginToken, setRequest(loginToken, loginType))
handleState(signUpResult)
}
}
Expand All @@ -53,7 +62,7 @@ class LoginViewModel @Inject constructor(
is Result.Error -> {
when (result.exception.message?.contains("status") ?: false) { // TODO : 리팩토링 data layer에서 파싱
true -> _loginState.emit(LoginState.Fail)
false -> _loginState.emit(LoginState.Already)
false -> _loginState.emit(LoginState.NotRegistered)
}
}
}
Expand All @@ -66,6 +75,6 @@ class LoginViewModel @Inject constructor(
sealed class LoginState {
object Init : LoginState()
data class Success(val data: AuthResult) : LoginState()
object Already : LoginState()
object NotRegistered : LoginState()
object Fail : LoginState()
}
1 change: 1 addition & 0 deletions feature/login/src/main/res/values/string.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@
<string name="kakao_login">카카오로 로그인</string>
<string name="google_login">구글로 로그인</string>
<string name="server_error">서버에러 고객센터에 문의해주세요.</string>
<string name="invalid_token">토큰이 유효하지 않습니다.</string>
</resources>
17 changes: 17 additions & 0 deletions feature/terms/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
plugins {
id("peonlee.android.feature")
}

android {
namespace = "com.peonlee.terms"
viewBinding { enable = true }
}

dependencies {
implementation(project(":core:ui"))
implementation(project(":core:common"))
implementation(project(":core:data"))

implementation(libs.androidx.constraintlayout)
implementation(libs.kotlinx.coroutines.android)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.peonlee.feature.terms

import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.runner.RunWith

/**
* Instrumented test, which will execute on an Android device.
*
* See [testing documentation](http://d.android.com/tools/testing).
*/
@RunWith(AndroidJUnit4::class)
class ExampleInstrumentedTest {
@Test
fun useAppContext() {
// Context of the app under test.
val appContext = InstrumentationRegistry.getInstrumentation().targetContext
assertEquals("com.peonlee.feature.terms", appContext.packageName)
}
}
9 changes: 9 additions & 0 deletions feature/terms/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application>
<activity
android:name="com.peonlee.feature.terms.TermsActivity"
android:exported="true">
</activity>
</application>
</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package com.peonlee.feature.terms

import android.app.Activity
import android.content.res.ColorStateList
import androidx.core.content.ContextCompat
import com.peonlee.core.ui.base.BaseActivity
import com.peonlee.terms.databinding.ActivityTermsBinding
import com.peonlee.core.ui.R.color as Color
import com.peonlee.core.ui.R.drawable as Drawable

class TermsActivity : BaseActivity<ActivityTermsBinding>() {
override fun bindingFactory(): ActivityTermsBinding = ActivityTermsBinding.inflate(layoutInflater)

override fun initViews() = with(binding) {
ivTermsClose.setOnClickListener {
setResult(Activity.RESULT_OK)
finish()
}

checkboxAllTerms.apply {
setOnClickListener {
checkboxService.isChecked = isChecked
checkboxPersonal.isChecked = isChecked
updateBackground(isChecked)
updateNextButton()
}
}

checkboxService.setOnClickListener {
checkboxAllTerms.isChecked = false
updateBackground(false)
updateNextButton()
}

checkboxPersonal.setOnClickListener {
checkboxAllTerms.isChecked = false
updateBackground(false)
updateNextButton()
}

tvStart.setOnClickListener {
setResult(Activity.RESULT_OK)
finish()
}
}

private fun updateBackground(isUpdate: Boolean) {
when (isUpdate) {
true -> binding.layoutTerms.setBackgroundResource(Drawable.bg_brand30_outline_brand60_radius_10dp)
false -> binding.layoutTerms.setBackgroundResource(Drawable.bg_white_outline_radius_10dp)
}
}

private fun updateNextButton() {
val isActive = binding.checkboxService.isChecked && binding.checkboxPersonal.isChecked
when (isActive) {
true -> updateState(true)
false -> updateState(false)
}
}

private fun updateState(isActive: Boolean) {
binding.tvStart.apply {
isEnabled = isActive
backgroundTintList = ColorStateList.valueOf(
ContextCompat.getColor(
this@TermsActivity,
if (isActive) Color.brand100 else Color.brand50
)
)
}
}
}
Loading

0 comments on commit be2b7af

Please sign in to comment.