diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 61a9130..fb7f4a8 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index d5d35ec..860da66 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..797acea --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index 83fe0e8..312fc96 100644 --- a/README.md +++ b/README.md @@ -1,82 +1,152 @@ -#### 1. 구현방법 -- 2차 세미나에서 배운 내용을 바탕으로 FollowingRepo.kt, FollowingRepoAdapter.kt, FollowingRepoFragment.kt, RepoInfoActivity.kt 등의 파일들을 -만들어 코드를 작성하였다. -- 먼저 부분 화면 Fragment를 만들어 ist로 구현해 화면으로 보여주기 위해 item_repo.xml을 만들어 +# ![마크업 이미지3](https://user-images.githubusercontent.com/80473521/118394517-1e93bd80-b680-11eb-9fb1-a14cb453e3ba.jpg) Seventh Seminar Assignment ![마크업 이미지3](https://user-images.githubusercontent.com/80473521/118394517-1e93bd80-b680-11eb-9fb1-a14cb453e3ba.jpg) + + +## ![마크업 이미지1](https://user-images.githubusercontent.com/80473521/118394520-1fc4ea80-b680-11eb-9641-df4063f3f257.jpg) 자동 로그인 구현하기 + +1) SignInActivity로 처음 들어왔을 때 SharedPreference에서 ID/PW가 있다면? 로그인 과정을 건너뛴다. +2) 로그인할 때 성공하면 SharedPreference에 집어 넣는다. +3) 서비스에서 로그아웃하면 SharedPreference를 clear한다. + +result => 위와 같은 과정으로 자동 로그인처럼 구현할 수 있다. + +### 1. Lv1-1 Activity에서 어떻게 처리했는지 정리 +< SignInActivity 코드 정리 > ```kotlin - + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityMainBinding.inflate(layoutInflater) + setContentView(binding.root) + searchUserAuthStorage() + loginButtonEvent() + signUpResult() + } + private fun searchUserAuthStorage() { + with(SoptUserAuthStorage.getInstance(this)) { + if (hasUserData()) { + requestLogin(getUserData().let { RequestLoginData(it.id, it.password) }) + } + } + } + + private fun loginButtonEvent() { + binding.button.setOnClickListener{ + val requestLoginData = RequestLoginData( + id = binding.idedit.text.toString(), + password = binding.passedit.text.toString() + ) + requestLogin(requestLoginData) + } + } + private fun signUpResult() { + binding.signup.setOnClickListener { + signUpActivityLauncher.launch( + Intent(this, SignUpActivity::class.java) + ) + } + } ``` -이와 같은 3개의 TextView를 생성하였다. 레포지터리 이름과 레포지터리 설명이 너무 긴경우 ...이 나오도록 +- SignInActivity가 onCreate일 때 이전에 작성한 ID/PW가 있으면 바로 로그인 시키고 없으면 원래 과정으로 진행 +- 전의 세미나에서 만든 것 그대로 +'button' 버튼을 누르면 id, password 데이터를 전달, +'signup' 텍스트를 누르면 SignUpActivity로 이동 + ```kotlin -android:ellipsize="end" +private fun requestLogin(requestLoginData: RequestLoginData) { + val call: Call = ServiceCreator.soptService + .postLogin(requestLoginData) + call.enqueueUtil( + onSuccess = { response -> + val data = response.data + showToast(data?.user_nickname.toString()) + with(SoptUserAuthStorage.getInstance(this)) { + saveUserData(requestLoginData.let { SoptUserInfo(it.id, it.password) }) + } + startHomeActivity() + } + ) + } ``` -코드도 추가해주었다. -* RecyclerView를 이용해 HomeActivity에 해당 Fragment를 보여주기 위해 fragment_following_repo.xml에 +- 확장함수를 이용하여 requestLogin 간단하게 구현 + +< 코틀린 확장 함수> +- ToastUtil.kt ```kotlin - +fun Context.showToast(msg: String) { + Toast.makeText(this, msg, Toast.LENGTH_SHORT) + .show() +} ``` -위와 같은 코드를 작성하고 화면에 보여주기 위해 HomeActivity에 +- RetrofitEnqueueUtil.kt ```kotlin -val repoFragment = FollowingRepoFragment() - val manager = supportFragmentManager - val transaction = manager.beginTransaction() - transaction.replace(R.id.fragment_container,repoFragment) - transaction.addToBackStack(null) - transaction.commit() +fun Call.enqueueUtil( + onSuccess: (ResponseType) -> Unit, + onError: ((stateCode: Int) -> Unit)? = null +) { + this.enqueue(object : Callback { + override fun onResponse(call: Call, response: Response) { + if (response.isSuccessful) { + onSuccess.invoke(response.body() ?: return) + } else { + onError?.invoke(response.code()) + } + } + + override fun onFailure(call: Call, t: Throwable) { + Log.d("NetworkTest", "error:$t") + } + }) +} ``` -위와 같은 코드를 추가해주었다. 이 코드를 통해 Fragment가 HomeActivity의 화면에 뜨게 된다. -* HomeActivity화면에 MORE 버튼을 추가하여 2차 세미나 시간에 만든 Fragment를 가진 Activity를 띄워주기 위해 먼저 +### 2. Lv1-2 SharedPreference 어떻게 코드를 정리했는지 코드 첨부 +- SharedPreference를 계속 만들면 비효율적이므로 object을 이용해 한 번만 만들기 ```kotlin -