Skip to content

Commit afed4a9

Browse files
committed
[Nunu/#38] feat: 8주차 구현1
- 로그인 및 로그아웃 구현 - 로그인 상태에 따른 로그인/로그아웃 처리 - 로그인, 회원가입 Acticity 연결 - 회원 가입 구현 - binding null 처리 추가
1 parent 95d668e commit afed4a9

File tree

11 files changed

+724
-4
lines changed

11 files changed

+724
-4
lines changed

UMC_6th/app/src/main/AndroidManifest.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@
4141
android:hardwareAccelerated="true"
4242
android:label="@string/title_activity_song"
4343
android:theme="@style/Theme.UMC_6th"></activity>
44+
<activity android:name=".LoginActivity"/>
45+
<activity android:name=".SignUpActivity"/>
4446
</application>
4547

4648
</manifest>

UMC_6th/app/src/main/java/com/example/umc_6th/LockerFragment.kt

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.example.umc_6th
22

3+
import android.content.Intent
34
import android.os.Bundle
45
import android.os.Handler
56
import android.view.LayoutInflater
@@ -40,6 +41,12 @@ class LockerFragment : Fragment() {
4041
tab.text = information[position]
4142
}.attach()
4243

44+
//로그인 intent
45+
binding.txLogin.setOnClickListener {
46+
val intent = Intent(requireActivity(), LoginActivity::class.java)
47+
startActivity(intent)
48+
}
49+
4350
return binding.root
4451
}
4552

@@ -82,4 +89,42 @@ class LockerFragment : Fragment() {
8289
_dislikeAllEvent.value = false
8390
}
8491
}
92+
93+
override fun onStart() {
94+
super.onStart()
95+
initViews()
96+
}
97+
98+
private fun getJwt() : Int {
99+
val spf = requireActivity().getSharedPreferences("auth", AppCompatActivity.MODE_PRIVATE)
100+
return spf!!.getInt("jwt", 0)
101+
}
102+
103+
private fun initViews() {
104+
val jwt: Int = getJwt()
105+
if (jwt == 0) {
106+
binding.txLogin.text="로그인"
107+
binding.txLogin.setOnClickListener{
108+
startActivity(Intent(requireActivity(), LoginActivity::class.java))
109+
}
110+
}else {
111+
binding.txLogin.text="로그아웃"
112+
binding.txLogin.setOnClickListener{
113+
logout()
114+
startActivity(Intent(requireActivity(), MainActivity::class.java))
115+
}
116+
}
117+
}
118+
119+
private fun logout() {
120+
val spf = activity?.getSharedPreferences("auth", AppCompatActivity.MODE_PRIVATE)
121+
val editor = spf!!.edit()
122+
editor.remove("jwt")
123+
editor.apply()
124+
}
125+
126+
override fun onDestroy() {
127+
super.onDestroy()
128+
_binding = null
129+
}
85130
}

UMC_6th/app/src/main/java/com/example/umc_6th/LockerSavedSongFragment.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@ import com.example.umc_6th.databinding.FragmentLockerSavedSongBinding
1212
import com.google.gson.Gson
1313

1414
class LockerSavedSongFragment : Fragment(){
15+
16+
private var _binding: FragmentLockerSavedSongBinding? = null
17+
private val binding get() = _binding!!
1518
private var songDatas = ArrayList<Song>()
16-
lateinit var binding : FragmentLockerSavedSongBinding
1719
lateinit var songDB: SongDatabase
1820
val lockerAlbumRecyclerAdapter = LockerAlbumRecyclerAdapter()
1921

@@ -28,7 +30,7 @@ class LockerSavedSongFragment : Fragment(){
2830
container: ViewGroup?,
2931
savedInstanceState: Bundle?
3032
): View? {
31-
binding = FragmentLockerSavedSongBinding.inflate(inflater, container, false)
33+
_binding = FragmentLockerSavedSongBinding.inflate(inflater, container, false)
3234
/*
3335
albumDatas.apply {
3436
add(Album(0, "Love wins all", "아이유 (IU)", R.drawable.img_album_lovewinsall))
@@ -125,6 +127,6 @@ class LockerSavedSongFragment : Fragment(){
125127

126128
override fun onDestroy() {
127129
super.onDestroy()
128-
130+
_binding = null
129131
}
130132
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package com.example.umc_6th
2+
3+
import android.content.Intent
4+
import android.os.Bundle
5+
import android.util.Log
6+
import android.widget.Toast
7+
import androidx.appcompat.app.AppCompatActivity
8+
import com.example.umc_6th.databinding.ActivityLoginBinding
9+
10+
class LoginActivity : AppCompatActivity() {
11+
12+
private var _binding : ActivityLoginBinding? = null
13+
private val binding get() = _binding!!
14+
override fun onCreate(savedInstanceState: Bundle?) {
15+
super.onCreate(savedInstanceState)
16+
_binding = ActivityLoginBinding.inflate(layoutInflater)
17+
setContentView(binding.root)
18+
19+
binding.loginSignUpTv.setOnClickListener{
20+
val intent = Intent(this, SignUpActivity::class.java)
21+
startActivity(intent)
22+
}
23+
24+
binding.loginCloseIv.setOnClickListener {
25+
finish()
26+
}
27+
binding.loginSignInBtn.setOnClickListener {
28+
login()
29+
}
30+
}
31+
32+
private fun login() {
33+
if (binding.loginIdEt.text.toString().isEmpty() || binding.loginDirectInputEt.text.toString().isEmpty()) {
34+
Toast.makeText(this, "이메일을 입력해주세요.", Toast.LENGTH_SHORT).show()
35+
return
36+
}
37+
38+
if (binding.loginPasswordEt.text.toString().isEmpty()) {
39+
Toast.makeText(this, "비밀번호를 입력해주세요.", Toast.LENGTH_SHORT).show()
40+
return
41+
}
42+
43+
val email : String = binding.loginIdEt.text.toString() + "@" + binding.loginDirectInputEt.text.toString()
44+
val pwd : String = binding.loginPasswordEt.text.toString()
45+
46+
val songDB = SongDatabase.getInstance(this)!!
47+
val user = songDB.userDao().getUser(email, pwd)
48+
49+
if (user != null) {
50+
Log.d("LoginActivity", user.id.toString())
51+
saveJwt(user.id)
52+
startMainActivity()
53+
} else {
54+
Toast.makeText(this, "회원 정보가 존재하지 않습니다", Toast.LENGTH_SHORT).show()
55+
}
56+
}
57+
58+
private fun startMainActivity() {
59+
val intent = Intent(this, MainActivity::class.java)
60+
startActivity(intent)
61+
}
62+
63+
private fun saveJwt(jwt: Int) {
64+
val spf = getSharedPreferences("auth" , MODE_PRIVATE)
65+
val editor = spf.edit()
66+
67+
editor.putInt("jwt", jwt)
68+
editor.apply()
69+
}
70+
71+
override fun onDestroy() {
72+
super.onDestroy()
73+
_binding = null
74+
}
75+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.example.umc_6th
2+
3+
import android.os.Bundle
4+
import android.util.Log
5+
import android.widget.Toast
6+
import androidx.appcompat.app.AppCompatActivity
7+
import com.example.umc_6th.databinding.ActivityLoginBinding
8+
import com.example.umc_6th.databinding.ActivitySignupBinding
9+
import com.example.umc_6th.User
10+
11+
class SignUpActivity : AppCompatActivity() {
12+
lateinit var binding : ActivitySignupBinding
13+
override fun onCreate(savedInstanceState: Bundle?) {
14+
super.onCreate(savedInstanceState)
15+
binding = ActivitySignupBinding.inflate(layoutInflater)
16+
setContentView(binding.root)
17+
18+
binding.signUpSignUpBtn.setOnClickListener {
19+
val signUpCompletion = signUp()
20+
if(signUpCompletion) {
21+
finish()
22+
}
23+
}
24+
}
25+
26+
private fun getUser() : User {
27+
val email : String = binding.signUpIdEt.text.toString() + "@" + binding.signUpDirectInputEt.text.toString()
28+
val password : String = binding.signUpPasswordEt.text.toString()
29+
val name : String = binding.signUpNameEt.text.toString()
30+
31+
return User(email, password, name)
32+
}
33+
34+
private fun signUp() : Boolean {
35+
if(binding.signUpIdEt.text.toString().isEmpty() || binding.signUpDirectInputEt.text.toString().isEmpty()) {
36+
Toast.makeText(this, "이메일 형식이 잘못되었습니다.", Toast.LENGTH_SHORT).show()
37+
return false
38+
}
39+
40+
if(binding.signUpPasswordEt.text.toString() != binding.signUpPasswordCheckEt.text.toString()) {
41+
Toast.makeText(this, "비밀번호가 일치하지 않습니다.", Toast.LENGTH_SHORT).show()
42+
return false
43+
}
44+
45+
val userDB = SongDatabase.getInstance(this)!!
46+
userDB.userDao().insert(getUser())
47+
48+
val user = userDB.userDao().getUsers()
49+
Log.d("sign-up", user.toString())
50+
51+
Toast.makeText(this, "회원가입이 완료되었습니다.", Toast.LENGTH_SHORT).show()
52+
return true
53+
}
54+
55+
}

UMC_6th/app/src/main/java/com/example/umc_6th/SongActivity.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ class SongActivity : AppCompatActivity() {
212212
val editor = sharedPreferences.edit()
213213
editor.putInt("songId", songs[nowPos].id)
214214
editor.apply()
215+
Log.d("songProgress", songs[nowPos].second.toString())
215216
}
216217
override fun onDestroy() {
217218
super.onDestroy()

UMC_6th/app/src/main/java/com/example/umc_6th/SongDatabase.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@ import androidx.room.Database
55
import androidx.room.Room
66
import androidx.room.RoomDatabase
77

8-
@Database(entities = [Song::class, Album::class], version = 1)
8+
@Database(entities = [Song::class, Album::class, User::class], version = 1)
99
abstract class SongDatabase: RoomDatabase() {
1010
abstract fun albumDao(): AlbumDao
1111
abstract fun songDao(): SongDao
12+
abstract fun userDao(): UserDao
1213

1314
companion object {
1415
private var instance: SongDatabase? = null
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.example.umc_6th
2+
3+
import androidx.room.Entity
4+
import androidx.room.PrimaryKey
5+
import com.google.gson.annotations.SerializedName
6+
7+
@Entity(tableName = "UserTable")
8+
data class User (
9+
@SerializedName(value = "email")val email: String,
10+
@SerializedName(value = "password")val password: String,
11+
@SerializedName(value = "name")val name: String
12+
){
13+
@PrimaryKey(autoGenerate = true) var id : Int = 0
14+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.example.umc_6th
2+
3+
import androidx.room.Dao
4+
import androidx.room.Insert
5+
import androidx.room.Query
6+
7+
@Dao
8+
interface UserDao {
9+
@Insert
10+
fun insert(user : User)
11+
12+
@Query("select * from UserTable")
13+
fun getUsers() : List<User>
14+
15+
@Query("select * from UserTable where email =:email and password = :password")
16+
fun getUser(email : String, password : String) : User?
17+
}

0 commit comments

Comments
 (0)