diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 32b8466..20454fb 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,8 @@ + diff --git a/app/src/main/java/com/example/beering/data/ApiResultInterceptor.kt b/app/src/main/java/com/example/beering/data/ApiResultInterceptor.kt index 36710b4..4985baf 100644 --- a/app/src/main/java/com/example/beering/data/ApiResultInterceptor.kt +++ b/app/src/main/java/com/example/beering/data/ApiResultInterceptor.kt @@ -15,7 +15,7 @@ import org.json.JSONObject class ApiResultInterceptor(val context : Context) : Interceptor { - // TODO : 나중에 다시 적용 + // TODO : 나중에 다시 적용` override fun intercept(chain: Interceptor.Chain): Response { val request = chain.request() val response = chain.proceed(request) diff --git a/app/src/main/java/com/example/beering/feature/auth/join/ui/CompleteActivity.kt b/app/src/main/java/com/example/beering/feature/auth/join/ui/CompleteActivity.kt index d79e5e3..25af4b2 100644 --- a/app/src/main/java/com/example/beering/feature/auth/join/ui/CompleteActivity.kt +++ b/app/src/main/java/com/example/beering/feature/auth/join/ui/CompleteActivity.kt @@ -15,6 +15,7 @@ import com.example.beering.feature.MainActivity import com.example.beering.feature.auth.login.domain.LoginUseCase import com.example.beering.feature.auth.login.ui.LoginActivity import com.example.beering.util.base.BaseActivity +import com.example.beering.util.changeLogin import com.google.android.material.snackbar.Snackbar import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -38,6 +39,8 @@ class CompleteActivity : BaseActivity(ActivityJoinC // UI를 업데이트합니다. result .onSuccess { + login.saveTokens(it.jwtInfo.accessToken, it.jwtInfo.refreshToken) + changeLogin(true) val mIntent = Intent(this@CompleteActivity, MainActivity::class.java) mIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK) startActivity(mIntent) diff --git a/app/src/main/java/com/example/beering/feature/auth/join/ui/JoinActivity.kt b/app/src/main/java/com/example/beering/feature/auth/join/ui/JoinActivity.kt index 941836f..4ba84a7 100644 --- a/app/src/main/java/com/example/beering/feature/auth/join/ui/JoinActivity.kt +++ b/app/src/main/java/com/example/beering/feature/auth/join/ui/JoinActivity.kt @@ -49,7 +49,9 @@ class JoinActivity: BaseActivity(ActivityJoinBinding::infla binding.joinIdIv22.visibility = View.VISIBLE binding.joinIdIv1.setOnClickListener { - binding.joinIdEd.text.clear() + binding.joinIdEd.text.clear( + + ) joinViewModel.setUserId("") } } else { diff --git a/app/src/main/java/com/example/beering/feature/auth/join/ui/JoinKakaoActivity.kt b/app/src/main/java/com/example/beering/feature/auth/join/ui/JoinKakaoActivity.kt new file mode 100644 index 0000000..fa0d2e9 --- /dev/null +++ b/app/src/main/java/com/example/beering/feature/auth/join/ui/JoinKakaoActivity.kt @@ -0,0 +1,221 @@ +package com.example.beering.feature.auth.join.ui + +import android.content.Intent +import android.text.Editable +import android.text.TextWatcher +import android.view.View +import android.view.ViewGroup +import androidx.activity.viewModels +import androidx.core.content.ContextCompat +import androidx.core.view.marginTop +import androidx.lifecycle.Observer +import com.example.beering.R +import com.example.beering.databinding.ActivityJoinBinding +import com.example.beering.util.addStatusBarMarginTop +import com.example.beering.util.base.BaseActivity +import com.example.beering.util.dpToPx + +class JoinKakaoActivity: BaseActivity(ActivityJoinBinding::inflate) { + private val joinViewModel : JoinViewModel by viewModels { JoinViewModel.Factory } + + + override fun initAfterBinding() { + binding.joinHeaderCl.root.addStatusBarMarginTop(this) + joinViewModel.setIsKakako(true) + binding.joinHeaderCl.toolbarBackIv.setOnClickListener { + finish() + } + + // ui재사용을 위한 초기 설정 + + binding.joinIdCl.visibility = View.GONE + binding.joinPasswordCl.visibility = View.GONE + binding.joinPasswordAgainCl.visibility = View.GONE + + val layoutParamsNicknme = binding.joinNicknameCl.layoutParams as ViewGroup.MarginLayoutParams + layoutParamsNicknme.topMargin = 0 + binding.joinNicknameCl.layoutParams = layoutParamsNicknme + + + + val layoutParamsNextOn = binding.joinNextOnIv.layoutParams as ViewGroup.MarginLayoutParams + layoutParamsNextOn.topMargin = dpToPx(500, this) + binding.joinNextOnIv.layoutParams = layoutParamsNextOn + + val layoutParamsNextOff = binding.joinNextOffIv.layoutParams as ViewGroup.MarginLayoutParams + layoutParamsNextOff.topMargin = dpToPx(500, this) + binding.joinNextOffIv.layoutParams = layoutParamsNextOff + + + + val nicknameEdit = binding.joinNicknameEd + joinViewModel.name.observe(this, Observer{ + if (it.isNotEmpty()) { + nicknameEdit.setTextColor( + ContextCompat.getColor( + this@JoinKakaoActivity, + R.color.beering_black + ) + ) + binding.joinNicknameBar.setBackgroundColor( + ContextCompat.getColor( + this@JoinKakaoActivity, + R.color.beering_black + ) + ) + binding.joinNicknameIv1.setImageResource(R.drawable.ic_delete_dark) + + } else { + nicknameEdit.setTextColor( + ContextCompat.getColor( + this@JoinKakaoActivity, + R.color.gray01 + ) + ) + binding.joinNicknameBar.setBackgroundColor( + ContextCompat.getColor( + this@JoinKakaoActivity, + R.color.gray01 + ) + ) + binding.joinNicknameIv1.setImageResource(R.drawable.ic_delete_light) + binding.conditionText.setTextColor( + ContextCompat.getColor( + this@JoinKakaoActivity, + R.color.gray01 + )) + binding.check5.setImageResource(R.drawable.ic_check_light) + binding.conditionLength2.setTextColor( + ContextCompat.getColor( + this@JoinKakaoActivity, + R.color.gray01 + )) + binding.check6.setImageResource(R.drawable.ic_check_light) + binding.joinNicknameIv21.visibility = View.VISIBLE + } + }) + joinViewModel.nicknameValidation.observe(this, Observer{ + // 닉네임이 영어, 한글 문자, 그리고 숫자로만 이루어져 있는지 확인 + if (it.characters) { + binding.conditionText.setTextColor( + ContextCompat.getColor( + this@JoinKakaoActivity, + R.color.beering_black + ) + ) + binding.check5.setImageResource(R.drawable.ic_check_dark) + } else { + binding.conditionText.setTextColor( + ContextCompat.getColor( + this@JoinKakaoActivity, + R.color.gray01 + ) + ) + binding.check5.setImageResource(R.drawable.ic_check_light) + } + + // 닉네임의 길이가 1에서 10자 사이인지 확인 + if (it.length) { + binding.conditionLength2.setTextColor( + ContextCompat.getColor( + this@JoinKakaoActivity, + R.color.beering_black + ) + ) + binding.check6.setImageResource(R.drawable.ic_check_dark) + } else { + binding.conditionLength2.setTextColor( + ContextCompat.getColor( + this@JoinKakaoActivity, + R.color.gray01 + ) + ) + binding.check6.setImageResource(R.drawable.ic_check_light) + } + // 닉네임이 유효한지 확인 + if (it.valid) { + binding.joinNicknameIv21.visibility = View.INVISIBLE + binding.joinNicknameIv22.visibility = View.VISIBLE + }else { + binding.joinNicknameIv21.visibility = View.VISIBLE + binding.joinNicknameIv22.visibility = View.GONE + } + }) // 닉네임 유효성 검사 + joinViewModel.nicknameCheck.observe(this, Observer{ + when(it!!){ + JoinViewModel.Companion.DuplicationCheck.PROCEEDING -> { + binding.conditionText.visibility = View.VISIBLE + binding.conditionLength2.visibility = View.VISIBLE + binding.check5.visibility = View.VISIBLE + binding.check6.visibility = View.VISIBLE + binding.joinNicknameCheck.visibility = View.GONE + binding.joinNicknameUncheck.visibility = View.GONE + } + JoinViewModel.Companion.DuplicationCheck.UNCHECKED -> { + binding.conditionText.visibility = View.GONE + binding.conditionLength2.visibility = View.GONE + binding.check5.visibility = View.GONE + binding.check6.visibility = View.GONE + binding.joinNicknameCheck.visibility = View.GONE + binding.joinNicknameUncheck.visibility = View.VISIBLE + } + JoinViewModel.Companion.DuplicationCheck.CHECKED -> { + binding.conditionText.visibility = View.GONE + binding.conditionLength2.visibility = View.GONE + binding.check5.visibility = View.GONE + binding.check6.visibility = View.GONE + binding.joinNicknameCheck.visibility = View.VISIBLE + binding.joinNicknameUncheck.visibility = View.GONE + } + } + + }) // 닉네임 중복여부 + joinViewModel.validNext.observe(this, Observer { + when(it){ + true -> binding.joinNextOnIv.visibility = View.VISIBLE + else -> binding.joinNextOnIv.visibility = View.GONE + } + }) + + + + // 닉네임 + nicknameEdit.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + joinViewModel.setName(nicknameEdit.text.toString()) + + } + override fun afterTextChanged(s: Editable?) {} + }) + + // 닉네임 x 버튼 + binding.joinNicknameIv1.setOnClickListener { + binding.joinNicknameEd.text.clear() + joinViewModel.setName("") + } + // 닉네임 중복체크 + binding.joinNicknameIv22.setOnClickListener { + joinViewModel.checkNickname() + } + + + + binding.joinNextOnIv.setOnClickListener { + val mIntent = Intent(this, TermActivity::class.java) + mIntent.putExtra("name", joinViewModel.name.value) + startActivity(mIntent) + } + + + + + + + + + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/beering/feature/auth/join/ui/JoinViewModel.kt b/app/src/main/java/com/example/beering/feature/auth/join/ui/JoinViewModel.kt index 85181ee..3f377af 100644 --- a/app/src/main/java/com/example/beering/feature/auth/join/ui/JoinViewModel.kt +++ b/app/src/main/java/com/example/beering/feature/auth/join/ui/JoinViewModel.kt @@ -48,6 +48,8 @@ class JoinViewModel( private val _snackBarEvent = MutableLiveData>() val snackBarEvent : LiveData> = _snackBarEvent + var isKakao : Boolean + init{ _userId.value = "" _password.value = "" @@ -55,6 +57,7 @@ class JoinViewModel( _name.value = "" _idCheck.value = DuplicationCheck.PROCEEDING _nicknameCheck.value = DuplicationCheck.PROCEEDING + isKakao = false } fun setUserId(id : String){ _userId.value = id @@ -81,6 +84,10 @@ class JoinViewModel( validNext() } + fun setIsKakako(isKakao : Boolean){ + this.isKakao = isKakao + } + fun validNext(){ if (pwValidation.value == null){ return @@ -93,9 +100,29 @@ class JoinViewModel( && pwValidation.value!!.isConfirmed && nicknameCheck.value == DuplicationCheck.CHECKED && idCheck.value == DuplicationCheck.CHECKED) + if(isKakao){ + validNextKakao() + } else { + if (pwValidation.value == null) { + return + } + _validNext.value = (pwValidation.value!!.valid + && pwValidation.value!!.isConfirmed + && nicknameCheck.value == DuplicationCheck.CHECKED + && idCheck.value == DuplicationCheck.CHECKED) + + } + } + + + + + fun validNextKakao(){ + _validNext.value = (nicknameCheck.value == DuplicationCheck.CHECKED) } fun checkId(){ + // TODO : 이메일 형식인지 정규식 확인 val cleanEmail = userId.value!!.trim() Log.d("userId", cleanEmail) viewModelScope.launch { @@ -120,6 +147,7 @@ class JoinViewModel( } fun checkNickname(){ + // TODO : 이름 형식 안맞으면 활성화 x 되게 viewModelScope.launch { validation.checkNickname(name.value!!) .onSuccess { diff --git a/app/src/main/java/com/example/beering/feature/auth/join/ui/TermActivity.kt b/app/src/main/java/com/example/beering/feature/auth/join/ui/TermActivity.kt index f0721b2..419d636 100644 --- a/app/src/main/java/com/example/beering/feature/auth/join/ui/TermActivity.kt +++ b/app/src/main/java/com/example/beering/feature/auth/join/ui/TermActivity.kt @@ -37,13 +37,14 @@ class TermActivity : BaseActivity(ActivityJoinTermBindi binding.termCheckFirstCb.isChecked = it[0] binding.termCheckSecondCb.isChecked = it[1] binding.termCheckThirdCb.isChecked = it[2] - if (it[0] && it[1] && it[2]){ + binding.termCheckAllCb.isChecked = it[0] && it[1] && it[2] + + if (it[0] && it[1]){ binding.termJoinOnIv.visibility = View.VISIBLE - binding.termCheckAllCb.isChecked = true } else { binding.termJoinOnIv.visibility = View.GONE - binding.termCheckAllCb.isChecked = false } + }) termViewModel.intentFlag.observe(this, Observer { it.getContentIfNotHandled()?.let{msg -> diff --git a/app/src/main/java/com/example/beering/feature/auth/login/ui/LoginActivity.kt b/app/src/main/java/com/example/beering/feature/auth/login/ui/LoginActivity.kt index eb427b7..c3929c0 100644 --- a/app/src/main/java/com/example/beering/feature/auth/login/ui/LoginActivity.kt +++ b/app/src/main/java/com/example/beering/feature/auth/login/ui/LoginActivity.kt @@ -13,6 +13,7 @@ import android.view.KeyEvent import android.view.View import android.view.animation.Animation import android.view.animation.AnimationUtils +import android.widget.EditText import android.widget.Toast import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity @@ -29,6 +30,7 @@ import com.example.beering.util.changeLogin import com.example.beering.util.getRetrofit import com.example.beering.util.setMemberId import com.example.beering.util.setToken +import com.google.android.material.card.MaterialCardView import com.google.android.material.snackbar.Snackbar import com.kakao.sdk.auth.AuthApiClient import com.kakao.sdk.auth.model.OAuthToken @@ -239,6 +241,33 @@ class LoginActivity : AppCompatActivity() { startActivity(intent) } +// binding.loginPasswordInvisibleIv.setOnClickListener { +// binding.loginPasswordEd.inputType = InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD +// binding.loginPasswordInvisibleIv.visibility = View.INVISIBLE +// binding.loginPasswordVisibleIv.visibility = View.VISIBLE +// } +// +// binding.loginPasswordVisibleIv.setOnClickListener { +// binding.loginPasswordEd.inputType = +// InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD +// binding.loginPasswordInvisibleIv.visibility = View.VISIBLE +// binding.loginPasswordVisibleIv.visibility = View.INVISIBLE +// } + + + //객체 생성 + val idEdit: EditText = binding.loginIdEd + val passwordEdit: EditText = binding.loginPasswordEd + val loginBtn: MaterialCardView = binding.loginBtnCv + + //메시지 담을 변수 + var id: String = "" + var password: String = "" + + + //버튼 비활성화 +// loginBtn.isEnabled = false + //EditText 값 있을때만 버튼 활성화 binding.loginIdEd.addTextChangedListener(object : TextWatcher { // 입력 하기 전에 작동 @@ -305,3 +334,4 @@ class LoginActivity : AppCompatActivity() { + diff --git a/app/src/main/java/com/example/beering/feature/auth/login/ui/LoginViewModel.kt b/app/src/main/java/com/example/beering/feature/auth/login/ui/LoginViewModel.kt index ca1eab4..face04e 100644 --- a/app/src/main/java/com/example/beering/feature/auth/login/ui/LoginViewModel.kt +++ b/app/src/main/java/com/example/beering/feature/auth/login/ui/LoginViewModel.kt @@ -15,6 +15,7 @@ import com.example.beering.data.onSuccess import com.example.beering.feature.auth.join.domain.UserValidationUseCase import com.example.beering.feature.auth.join.ui.JoinViewModel import com.example.beering.feature.auth.login.domain.LoginUseCase +import com.example.beering.util.changeLogin import kotlinx.coroutines.launch class LoginViewModel( @@ -50,6 +51,7 @@ class LoginViewModel( login(id.value!!, pw.value!!) .onSuccess { login.saveTokens(it.jwtInfo.accessToken, it.jwtInfo.refreshToken) + changeLogin(true) _loginSuccess.value = SingleLiveEvent(true) } .onFail{code, msg -> diff --git a/app/src/main/java/com/example/beering/feature/home/HomeFragment.kt b/app/src/main/java/com/example/beering/feature/home/HomeFragment.kt index e43fe08..9936de8 100644 --- a/app/src/main/java/com/example/beering/feature/home/HomeFragment.kt +++ b/app/src/main/java/com/example/beering/feature/home/HomeFragment.kt @@ -31,6 +31,7 @@ class HomeFragment: Fragment() { savedInstanceState: Bundle? ): View? { binding = FragmentHomeBinding.inflate(inflater, container, false) + val recyclerView: RecyclerView = binding.itemHomeRv var homeService:ReviewsApiService? = null diff --git a/app/src/main/java/com/example/beering/feature/search/DrinkSearchFragment.kt b/app/src/main/java/com/example/beering/feature/search/DrinkSearchFragment.kt index 21e5d7f..cf66a0a 100644 --- a/app/src/main/java/com/example/beering/feature/search/DrinkSearchFragment.kt +++ b/app/src/main/java/com/example/beering/feature/search/DrinkSearchFragment.kt @@ -55,7 +55,7 @@ class DrinkSearchFragment : Fragment() { // 0: 이름순, 1: 리뷰많은순, 2: 최저가순, 3: 평점순 var searchCountry : String? = null - var searchTagList = mutableListOf() // 필터 태그 + var searchTagList : MutableList? = null // 필터 태그 // 필터 하위 옵션 var searchSweetness: Int? = null // 와인 하위옵션 @@ -217,7 +217,7 @@ class DrinkSearchFragment : Fragment() { } - drinkSearchService.drinkSearch(null,binding.drinkSearchTopSearchEd.text.toString(), searchType, searchSort, searchPrice_min, searchPrice_max, searchCountry, searchTagList.joinToString(","), searchSweetness).enqueue(object : retrofit2.Callback { + drinkSearchService.drinkSearch(null,binding.drinkSearchTopSearchEd.text?.toString()?.takeIf { it.isNotEmpty() }, searchType, searchSort, searchPrice_min, searchPrice_max, searchCountry, null, searchSweetness).enqueue(object : retrofit2.Callback { override fun onResponse( call: Call, response: Response @@ -334,8 +334,8 @@ class DrinkSearchFragment : Fragment() { getRetrofit().create(DrinkSearchApiService::class.java) } - - drinkSearchService.drinkSearch(null,binding.drinkSearchTopSearchEd.text.toString(), searchType, searchSort, searchPrice_min, searchPrice_max, searchCountry, searchTagList.joinToString(","), searchSweetness).enqueue(object : retrofit2.Callback { + val searchTag = searchTagList?.joinToString(",") + drinkSearchService.drinkSearch(null,binding.drinkSearchTopSearchEd.text?.toString()?.takeIf { it.isNotEmpty() } , searchType, searchSort, searchPrice_min, searchPrice_max, searchCountry, searchTag , searchSweetness).enqueue(object : retrofit2.Callback { override fun onResponse( call: Call, response: Response diff --git a/app/src/main/java/com/example/beering/util/ApiClient.kt b/app/src/main/java/com/example/beering/util/ApiClient.kt index 767d536..38d8ee3 100644 --- a/app/src/main/java/com/example/beering/util/ApiClient.kt +++ b/app/src/main/java/com/example/beering/util/ApiClient.kt @@ -32,7 +32,7 @@ class HeaderInterceptor constructor(private val token: String) : Interceptor { @Throws(IOException::class) override fun intercept(chain: Interceptor.Chain): Response { - val token = "Bearer $token" + val token = "$token" val newRequest = chain.request().newBuilder() .addHeader("Authorization", token) .build() diff --git a/app/src/main/java/com/example/beering/util/base/BaseResponse.kt b/app/src/main/java/com/example/beering/util/base/BaseResponse.kt index 8fc3302..a4bdb6d 100644 --- a/app/src/main/java/com/example/beering/util/base/BaseResponse.kt +++ b/app/src/main/java/com/example/beering/util/base/BaseResponse.kt @@ -6,5 +6,5 @@ data class BaseResponse ( @SerializedName("isSuccess") val isSuccess: Boolean, @SerializedName("responseCode") val responseCode: Int, @SerializedName("responseMessage") val responseMessage: String, - @SerializedName("result") val result: T? + @SerializedName("result") val result: T? ) \ No newline at end of file diff --git a/app/src/main/res/layout/activity_join.xml b/app/src/main/res/layout/activity_join.xml index f922316..a203c8d 100644 --- a/app/src/main/res/layout/activity_join.xml +++ b/app/src/main/res/layout/activity_join.xml @@ -520,7 +520,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/join_input_cl"/> - + + app:showAsAction="always" + />