Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FEAT/seminar1] 심화과제 / 도전과제 #6

Merged
merged 11 commits into from
Nov 8, 2023
2 changes: 2 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
</activity>
<activity
android:name=".presentation.logIn.LogInActivity"
android:windowSoftInputMode="adjustResize"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
Expand All @@ -29,6 +30,7 @@
</activity>
<activity
android:name=".presentation.signUp.SignUpActivity"
android:windowSoftInputMode="adjustResize"
android:exported="false">
</activity>
<activity
Expand Down
36 changes: 36 additions & 0 deletions app/src/main/java/org/sopt/dosopttemplate/base/BaseActivity.kt
Original file line number Diff line number Diff line change
@@ -1,19 +1,55 @@
package org.sopt.dosopttemplate.base

import android.os.Bundle
import android.view.MotionEvent
import android.view.inputmethod.InputMethodManager
import androidx.activity.OnBackPressedCallback
import androidx.annotation.LayoutRes
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import androidx.databinding.ViewDataBinding
import org.sopt.dosopttemplate.util.SnackBar

abstract class BaseActivity<T : ViewDataBinding>(
@LayoutRes private val layoutRes: Int,
) : AppCompatActivity() {
lateinit var binding: T

private var backPressedTime = 0L

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, layoutRes)
binding.lifecycleOwner = this

initPressedBackBtn()
}

override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
hideKeyboard()
return super.dispatchTouchEvent(ev)
}

private fun hideKeyboard() {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저도 이 부분 코드리뷰로 확장함수를 처리해서 사용하니 다른 곳에서도 확장성있게 사용할 수 있어서! 좋았습니다!

val inputMethodManager = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
inputMethodManager.hideSoftInputFromWindow(currentFocus?.windowToken, 0)
}

private fun initPressedBackBtn() {
onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (System.currentTimeMillis() - backPressedTime >= 2000L) {
backPressedTime = System.currentTimeMillis()
SnackBar.makeSnackBar(binding.root, BACK_MESSAGE)
} else {
finishAffinity()
}
}
}
)
}

companion object {
const val BACK_MESSAGE = "뒤로가기 버튼을 한번 더 누르면 종료됩니다."
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package org.sopt.dosopttemplate.data.datasource.local

import android.content.Context
import android.content.SharedPreferences
import org.sopt.dosopttemplate.data.entity.UserData


object SharedPreference {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오.. 저도 SharedPreference 사용할 때 object 를 사용하면 범용성있게 사용할 수 있겠네요.. 저도 리팩토링할 때 참고하도록 하겠습니다

private lateinit var prefs: SharedPreferences

fun initSetSharedPreference(context: Context) {
prefs = context.getSharedPreferences(USER_PREFS, Context.MODE_PRIVATE)
}

fun isValidUserData() = prefs.getString(USER_ID, "")?.isNotBlank() ?: false

fun setUserData(user: UserData) {
with(prefs.edit()) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

요 부분 SharedPreference ktx 사용하면 아래 코드처럼 사용할 수 있더라구요 (의진이가 알려줬습니다!)

prefs.edit(commit = true) {
  putString(USER_ID, user.id)
   putString(USER_PW, user.pw)
  putString(USER_NICKNAME, user.nickName)
  putString(USER_MBTI, user.mbti)
}

putString(USER_ID, user.id)
putString(USER_PW, user.pw)
putString(USER_NICKNAME, user.nickName)
putString(USER_MBTI, user.mbti)
}.commit()
}

fun getUserData(): UserData {
with(prefs) {
return UserData(
getString(USER_ID, "").toString(),
getString(USER_PW, "").toString(),
getString(USER_NICKNAME, "").toString(),
getString(USER_MBTI, "").toString()
)
}
}

fun clearUserData() {
with(prefs.edit()) {
clear()
commit()
}
}

}

const val USER_PREFS = "user_prefs"
const val USER_ID = "user_id"
const val USER_PW = "user_pw"
const val USER_NICKNAME = "user_nickname"
const val USER_MBTI = "user_mbti"
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.sopt.dosopttemplate.data
package org.sopt.dosopttemplate.data.entity


sealed class Profile {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.sopt.dosopttemplate.data
package org.sopt.dosopttemplate.data.entity

import android.os.Parcelable
import kotlinx.parcelize.Parcelize
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import android.os.Bundle
import androidx.fragment.app.Fragment
import org.sopt.dosopttemplate.R
import org.sopt.dosopttemplate.base.BaseActivity
import org.sopt.dosopttemplate.data.UserData
import org.sopt.dosopttemplate.data.entity.UserData
import org.sopt.dosopttemplate.databinding.ActivityHomeBinding
import org.sopt.dosopttemplate.presentation.home.doandroid.DoAndroidFragment
import org.sopt.dosopttemplate.presentation.home.mypage.MyPageFragment
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import android.content.Context
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import org.sopt.dosopttemplate.data.Profile
import org.sopt.dosopttemplate.data.entity.Profile
import org.sopt.dosopttemplate.databinding.ItemHomeFriendMusicBinding
import org.sopt.dosopttemplate.databinding.ItemHomeFriendOriginalBirthdayBinding
import org.sopt.dosopttemplate.databinding.ItemHomeMyProfileBinding
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package org.sopt.dosopttemplate.presentation.home.home

import androidx.databinding.ViewDataBinding
import androidx.recyclerview.widget.RecyclerView
import org.sopt.dosopttemplate.data.Profile
import org.sopt.dosopttemplate.data.entity.Profile
import org.sopt.dosopttemplate.databinding.ItemHomeFriendMusicBinding
import org.sopt.dosopttemplate.databinding.ItemHomeFriendOriginalBirthdayBinding
import org.sopt.dosopttemplate.databinding.ItemHomeMyProfileBinding
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package org.sopt.dosopttemplate.presentation.home.home

import androidx.lifecycle.ViewModel
import org.sopt.dosopttemplate.data.Profile
import org.sopt.dosopttemplate.data.entity.Profile

class HomeViewModel : ViewModel() {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package org.sopt.dosopttemplate.presentation.home.mypage

import android.content.Intent
import android.os.Bundle
import android.view.View
import org.sopt.dosopttemplate.R
import org.sopt.dosopttemplate.base.BaseFragment
import org.sopt.dosopttemplate.data.datasource.local.SharedPreference
import org.sopt.dosopttemplate.databinding.FragmentMypageBinding
import org.sopt.dosopttemplate.presentation.logIn.LogInActivity

class MyPageFragment : BaseFragment<FragmentMypageBinding>() {

Expand All @@ -15,6 +18,7 @@ class MyPageFragment : BaseFragment<FragmentMypageBinding>() {
super.onViewCreated(view, savedInstanceState)

initMakeMainView()
initSetLogOut()
}

private fun initMakeMainView() {
Expand All @@ -25,4 +29,15 @@ class MyPageFragment : BaseFragment<FragmentMypageBinding>() {
}
}

private fun initSetLogOut() {
binding.tvMainLogOut.setOnClickListener {
SharedPreference.clearUserData()
activity?.let {
val intent = Intent(context, LogInActivity::class.java)
startActivity(intent)
}

}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContracts
import org.sopt.dosopttemplate.R
import org.sopt.dosopttemplate.base.BaseActivity
import org.sopt.dosopttemplate.data.UserData
import org.sopt.dosopttemplate.data.datasource.local.SharedPreference
import org.sopt.dosopttemplate.data.entity.UserData
import org.sopt.dosopttemplate.databinding.ActivityLoginBinding
import org.sopt.dosopttemplate.presentation.home.home.HomeActivity
import org.sopt.dosopttemplate.presentation.signUp.SignUpActivity
Expand All @@ -16,58 +17,69 @@ import org.sopt.dosopttemplate.util.getParcelable

class LogInActivity : BaseActivity<ActivityLoginBinding>(R.layout.activity_login) {
private lateinit var resultLauncher: ActivityResultLauncher<Intent>
private lateinit var userData: UserData
private var userData: UserData = UserData()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

initSignUpActivityLauncher()
initSignUpBtnClickListener()
initLogInBtnClickListener()
initSetAutoLogIn()
}

private fun initSetAutoLogIn() {
with(SharedPreference) {
initSetSharedPreference(this@LogInActivity)
if (isValidUserData()) {
sendUserData(getUserData())
}
}
}

private fun initSignUpActivityLauncher() {
resultLauncher = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()) { result ->
ActivityResultContracts.StartActivityForResult()
) { result ->
if (result.resultCode == RESULT_OK) {
userData = result.data?.getParcelable(USER_DATA, UserData::class.java) ?: return@registerForActivityResult
userData = result.data?.getParcelable(USER_DATA, UserData::class.java)
?: return@registerForActivityResult
SharedPreference.setUserData(userData)
}
}
}

private fun initSignUpBtnClickListener() {
binding.btLogInDoSignUp.setOnClickListener {
binding.btnLogInDoSignUp.setOnClickListener {
intent = Intent(this, SignUpActivity::class.java)
resultLauncher.launch(intent)
}
}

private fun initLogInBtnClickListener() {
binding.btLogInDoLogIn.setOnClickListener {
if (checkValidLogIn()) doLogIn()
binding.btnLogInDoLogIn.setOnClickListener {
if (checkValidLogIn()) doLogIn(userData)
else makeSnackBar(binding.root, MESSAGE_LOGIN_FAIL)
}
}

private fun checkValidLogIn(): Boolean {
with(binding) {
return (userData.id == etLogInId.text.toString() && userData.pw == etLogInPw.text.toString())
return (userData.id.isNotBlank() && userData.id == etLogInId.text.toString() && userData.pw == etLogInPw.text.toString())
}
}

private fun doLogIn() {
private fun doLogIn(data: UserData) {
makeToast(applicationContext, MESSAGE_LOGIN_SUCCESS)
sendUserData()
sendUserData(data)
}

private fun sendUserData() {
private fun sendUserData(data: UserData) {
intent = Intent(this, HomeActivity::class.java)
with(binding) {
intent.putExtra(
USER_DATA,
userData
)
}
intent.putExtra(
USER_DATA,
data
)

startActivity(intent)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,7 @@ package org.sopt.dosopttemplate.presentation.main
import android.os.Bundle
import org.sopt.dosopttemplate.R
import org.sopt.dosopttemplate.base.BaseActivity
import org.sopt.dosopttemplate.data.UserData
import org.sopt.dosopttemplate.databinding.ActivityMainBinding
import org.sopt.dosopttemplate.presentation.logIn.LogInActivity
import org.sopt.dosopttemplate.util.getParcelable

class MainActivity : BaseActivity<ActivityMainBinding>(R.layout.activity_main) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import android.content.Intent
import android.os.Bundle
import org.sopt.dosopttemplate.R
import org.sopt.dosopttemplate.base.BaseActivity
import org.sopt.dosopttemplate.data.UserData
import org.sopt.dosopttemplate.data.entity.UserData
import org.sopt.dosopttemplate.databinding.ActivitySignupBinding
import org.sopt.dosopttemplate.presentation.logIn.LogInActivity
import org.sopt.dosopttemplate.presentation.logIn.LogInActivity.Companion.USER_DATA
Expand All @@ -20,7 +20,7 @@ class SignUpActivity : BaseActivity<ActivitySignupBinding>(R.layout.activity_sig
}

private fun initSignUpBtnClickListener() {
binding.btSignUpDoSignUp.setOnClickListener {
binding.btnSignUpDoSignUp.setOnClickListener {
if (checkValidSignUp()) doSignUp()
else makeSnackBar(binding.root, MESSAGE_SIGNUP_FAIL)
}
Expand Down Expand Up @@ -50,7 +50,8 @@ class SignUpActivity : BaseActivity<ActivitySignupBinding>(R.layout.activity_sig
etSignUpPW.text.toString(),
etSignUpNickName.text.toString(),
etSignUpMBTI.text.toString()
))
)
)
}
setResult(RESULT_OK, intent)
finish()
Expand Down
Loading