diff --git a/backy/week4/app/build.gradle.kts b/backy/week4/app/build.gradle.kts index fdc7769..92a4c18 100644 --- a/backy/week4/app/build.gradle.kts +++ b/backy/week4/app/build.gradle.kts @@ -58,4 +58,19 @@ dependencies { implementation("androidx.room:room-ktx:$roomVersion") kapt("androidx.room:room-compiler:$roomVersion") + //Retrofit + implementation("com.squareup.retrofit2:retrofit:2.9.0") + implementation("com.squareup.retrofit2:converter-gson:2.9.0") + implementation("com.squareup.retrofit2:adapter-rxjava2:2.9.0") + + //okhttp + implementation("com.squareup.okhttp3:okhttp:4.12.0") + implementation("com.squareup.okhttp3:logging-interceptor:4.12.0") + + //Glide + implementation("com.github.bumptech.glide:glide:4.11.0") + implementation("com.github.bumptech.glide:compiler:4.11.0") + + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.0") } \ No newline at end of file diff --git a/backy/week4/app/src/main/AndroidManifest.xml b/backy/week4/app/src/main/AndroidManifest.xml index 0d6e6f8..ff68b8a 100644 --- a/backy/week4/app/src/main/AndroidManifest.xml +++ b/backy/week4/app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ + + android:theme="@style/Theme.Week2" + android:usesCleartextTraffic="true"> + + @POST("login") + fun login(@Body user: User):Call + + @GET("test") + fun test(@Header("Authorization") token: String): Call +} \ No newline at end of file diff --git a/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/AuthService.kt b/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/AuthService.kt new file mode 100644 index 0000000..f5ecc42 --- /dev/null +++ b/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/AuthService.kt @@ -0,0 +1,119 @@ +package com.rkdgudrn4094.week2 + +import android.util.Log +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response + +class AuthService { + private lateinit var signUpView: SignUpView + private lateinit var loginView: LoginView + private lateinit var testView: TestView + + fun setSignUpView(signUpView: SignUpView){ + this.signUpView = signUpView + } + fun setLoginView(loginView: LoginView){ + this.loginView = loginView + } + fun setTestView(testView: TestView){ + this.testView = testView + } + + fun signUp(user: User){ + val authService = getRetrofit().create(AuthRetrofitInterface::class.java) + authService.signUp(user).enqueue(object: Callback{ + override fun onResponse( + call: Call, + response: Response + ) { + Log.d("SIGNUP/SUCCESS", response.toString()) + + val resp: AuthResponse = response.body()!! + + if(::signUpView.isInitialized){ + when(resp.code){ + "COMMON201"->signUpView.onSignUpSuccess() + else->signUpView.onSignUpFailure() + } + } + + } + + override fun onFailure( + call: Call, + t: Throwable + ) { + Log.d("SIGNUP/FAILURE", t.message.toString()) + } + + + }) + + Log.d("SIGNUP", "HELLOOO") + } + + fun login(user: User){ + val authService = getRetrofit().create(AuthRetrofitInterface::class.java) + authService.login(user).enqueue(object: Callback{ + override fun onResponse( + call: Call, + response: Response + ) { + Log.d("LOGIN/SUCCESS", response.toString()) + + val resp: AuthResponse = response.body()!! + val code = resp.code + if(::loginView.isInitialized){ + when(code){ + "COMMON200_1"->loginView.onLoginSuccess(code, resp.data!!) + else->loginView.onLoginFailure() + } + } + + } + + override fun onFailure( + call: Call, + t: Throwable + ) { + Log.d("LOGIN/FAILURE", t.message.toString()) + } + }) + + Log.d("LOGIN", "HELLOOO") + } + + fun test(token: String){ + val bearerToken = if (token.startsWith("Bearer ")) token else "Bearer $token" + + val authService = getRetrofit().create(AuthRetrofitInterface::class.java) + authService.test(bearerToken).enqueue(object: Callback{ + override fun onResponse( + call: Call, + response: Response + ) { + Log.d("TEST/SUCCESS", response.toString()) + + val resp: TestResponse = response.body()!! + val code = resp.code + if(::testView.isInitialized){ + when(code){ + "COMMON200_1"->testView.onTestSuccess(resp.message) + else->testView.onTestFailure() + } + } + } + + override fun onFailure( + call: Call, + t: Throwable + ) { + Log.d("TEST/FAILURE", t.message.toString()) + } + + }) + + Log.d("LOGIN", "HELLOOO") + } +} \ No newline at end of file diff --git a/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/LoginActivity.kt b/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/LoginActivity.kt index 4b7b8db..dc51841 100644 --- a/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/LoginActivity.kt +++ b/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/LoginActivity.kt @@ -8,7 +8,7 @@ import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com.rkdgudrn4094.week2.databinding.ActivityLoginBinding -class LoginActivity: AppCompatActivity() { +class LoginActivity: AppCompatActivity(), LoginView { lateinit var binding: ActivityLoginBinding override fun onCreate(savedInstanceState: Bundle?) { @@ -39,6 +39,7 @@ class LoginActivity: AppCompatActivity() { val email: String = binding.loginIdEt.text.toString() + '@' + binding.loginDirectInputEt.text.toString() val pwd: String = binding.loginPasswordEt.text.toString() + /* val songDB = SongDatabase.getInstance(this)!! val user = songDB.userDao().getUser(email, pwd) @@ -46,7 +47,11 @@ class LoginActivity: AppCompatActivity() { Log.d("LOGIN_ACT/GET_USER", "userId: ${user.id}, $user") saveJwt(user.id) startMainActivity() - } + }*/ + val authService = AuthService() + authService.setLoginView(this) + + authService.login(User("", email, pwd)) Toast.makeText(this, "회원 정보가 존재하지 않습니다.", Toast.LENGTH_SHORT).show() } @@ -59,8 +64,30 @@ class LoginActivity: AppCompatActivity() { editor.apply() } + private fun saveJwt2(jwt: String){ + val spf = getSharedPreferences("auth2", MODE_PRIVATE) + val editor = spf.edit() + + editor.putString("jwt", jwt) + editor.apply() + } + private fun startMainActivity(){ val intent = Intent(this, MainActivity::class.java) startActivity(intent) } + + override fun onLoginSuccess(code: String, data: LoginData) { + Log.d("LOGIN","code:${code}") + when(code){ + "COMMON200_1"->{ + saveJwt2(data.accessToken) + startMainActivity() + } + } + } + + override fun onLoginFailure() { + // 로그인 실패 처리 + } } \ No newline at end of file diff --git a/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/LoginView.kt b/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/LoginView.kt new file mode 100644 index 0000000..e0ae971 --- /dev/null +++ b/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/LoginView.kt @@ -0,0 +1,6 @@ +package com.rkdgudrn4094.week2 + +interface LoginView { + fun onLoginSuccess(code: String, data: LoginData) + fun onLoginFailure() +} \ No newline at end of file diff --git a/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/MainActivity.kt b/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/MainActivity.kt index 7e7eba5..61b6f7e 100644 --- a/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/MainActivity.kt +++ b/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/MainActivity.kt @@ -9,15 +9,12 @@ import androidx.activity.enableEdgeToEdge import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen -import androidx.core.view.ViewCompat -import androidx.core.view.WindowInsetsCompat import com.google.gson.Gson import com.rkdgudrn4094.week2.databinding.ActivityMainBinding -//import kotlin.jvm.java -class MainActivity : AppCompatActivity(), HomeFragmentDataListener { +class MainActivity : AppCompatActivity(), HomeFragmentDataListener, TestView { private val getResultText = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){ - result -> + result -> if (result.resultCode == Activity.RESULT_OK){ val title = result.data?.getStringExtra("title") val singer = result.data?.getStringExtra("singer") @@ -41,23 +38,7 @@ class MainActivity : AppCompatActivity(), HomeFragmentDataListener { inputDummySongs() inputDummyAlbums() - //val song = Song(binding.mainMiniplayerTitleTv.text.toString(), binding.mainMiniplayerSingerTv.text.toString(), 0, 60, false, "music_lilac") - binding.mainPlayerCl.setOnClickListener { - - /* - Log.d("Activity", "MainActivity, song.second:${song.second}") - val intent = Intent(this, SongActivity::class.java) - intent.putExtra("title", song.title) - intent.putExtra("singer", song.singer) - intent.putExtra("second", song.second) - intent.putExtra("playTime", song.playTime) - intent.putExtra("isPlaying", song.isPlaying) - intent.putExtra("music", song.music) - getResultText.launch(intent) - - */ - val editor = getSharedPreferences("song", MODE_PRIVATE).edit() editor.putInt("songId", song.id) editor.apply() @@ -66,7 +47,13 @@ class MainActivity : AppCompatActivity(), HomeFragmentDataListener { startActivity(intent) } + binding.mainTokenTestTv.setOnClickListener { + testToken() + } + initBottomNavigation() + + Log.d("MAIN/JWT_TO_SERVER", getJwt().toString()) } private fun initBottomNavigation(){ @@ -161,6 +148,28 @@ class MainActivity : AppCompatActivity(), HomeFragmentDataListener { Log.d("OnStart song ID", song.second.toString()) } + private fun getJwt(): String?{ + val spf = this.getSharedPreferences("auth2", AppCompatActivity.MODE_PRIVATE) + return spf!!.getString("jwt", "") + } + + override fun onTestSuccess(message: String) { + Toast.makeText(this, "msg: ${message}", Toast.LENGTH_LONG).show() + } + + override fun onTestFailure() { + //테스트 실패 코드 + } + + private fun testToken(){ + val authService = AuthService() + authService.setTestView(this) + + val token: String=getJwt()!! + Log.d("MAIN", "getJwt: ${token}") + + authService.test(token) + } private fun inputDummySongs(){ diff --git a/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/NetworkModule.kt b/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/NetworkModule.kt new file mode 100644 index 0000000..e46ccae --- /dev/null +++ b/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/NetworkModule.kt @@ -0,0 +1,16 @@ +package com.rkdgudrn4094.week2 + +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory + +const val BASE_URL = "http://43.200.73.115:8080/" + +fun getRetrofit(): Retrofit{ + val retrofit = Retrofit.Builder().baseUrl(BASE_URL) + .addConverterFactory(GsonConverterFactory.create()).build() + + return retrofit +} +/* +class NetworkModule { +}*/ \ No newline at end of file diff --git a/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/SignUpActivity.kt b/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/SignUpActivity.kt index 38c55d1..927b163 100644 --- a/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/SignUpActivity.kt +++ b/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/SignUpActivity.kt @@ -3,11 +3,16 @@ package com.rkdgudrn4094.week2 import android.os.Bundle import android.os.PersistableBundle import android.util.Log +import android.view.View import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com.rkdgudrn4094.week2.databinding.ActivitySignupBinding +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import retrofit2.create -class SignUpActivity: AppCompatActivity() { +class SignUpActivity: AppCompatActivity(), SignUpView { lateinit var binding: ActivitySignupBinding @@ -18,17 +23,19 @@ class SignUpActivity: AppCompatActivity() { binding.signUpSignUpBtn.setOnClickListener { signUp() - finish() + //finish() } } private fun getUser(): User{ val email: String = binding.signUpIdEt.text.toString() + '@' + binding.signUpDirectInputEt.text.toString() val pwd: String = binding.signUpPasswordEt.text.toString() + var name: String = binding.signUpNameEt.text.toString() - return User(email, pwd) + return User(name, email, pwd) } + /* private fun signUp(){ if (binding.signUpIdEt.text.toString().isEmpty() || binding.signUpDirectInputEt.text.toString().isEmpty()){ Toast.makeText(this, "이메일 형식이 잘못되었습니다.", Toast.LENGTH_SHORT).show() @@ -45,4 +52,36 @@ class SignUpActivity: AppCompatActivity() { val user = userDB.userDao().getUsers() Log.d("SIGNUPACT", user.toString()) } + + */ + + private fun signUp(){ + if (binding.signUpIdEt.text.toString().isEmpty() || binding.signUpDirectInputEt.text.toString().isEmpty()){ + Toast.makeText(this, "이메일 형식이 잘못되었습니다.", Toast.LENGTH_SHORT).show() + return + } + if (binding.signUpPasswordEt.text.toString() != binding.signUpPasswordCheckEt.text.toString()){ + Toast.makeText(this, "비밀번호가 일치하지 않습니다.", Toast.LENGTH_SHORT).show() + return + } + if (binding.signUpNameEt.text.toString().isEmpty()){ + Toast.makeText(this, "이름 형식이 잘못되었습니다.", Toast.LENGTH_SHORT).show() + return + } + + + + val authService = AuthService() + authService.setSignUpView(this) + + authService.signUp(getUser()) + } + + override fun onSignUpSuccess() { + finish() + } + + override fun onSignUpFailure() { + // 회원 가입 실패 처리 + } } \ No newline at end of file diff --git a/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/SignUpView.kt b/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/SignUpView.kt new file mode 100644 index 0000000..c2729f6 --- /dev/null +++ b/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/SignUpView.kt @@ -0,0 +1,6 @@ +package com.rkdgudrn4094.week2 + +interface SignUpView { + fun onSignUpSuccess() + fun onSignUpFailure() +} \ No newline at end of file diff --git a/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/TestResponse.kt b/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/TestResponse.kt new file mode 100644 index 0000000..ca1e533 --- /dev/null +++ b/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/TestResponse.kt @@ -0,0 +1,14 @@ +package com.rkdgudrn4094.week2 + +import com.google.gson.annotations.SerializedName + +data class TestResponse( + @SerializedName(value="status") val status: Boolean, + @SerializedName(value="code") val code: String, + @SerializedName(value="message") val message: String, + @SerializedName(value="data") val data: TestData? +) + +data class TestData( + @SerializedName(value="result") val result: String +) diff --git a/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/TestView.kt b/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/TestView.kt new file mode 100644 index 0000000..b648550 --- /dev/null +++ b/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/TestView.kt @@ -0,0 +1,6 @@ +package com.rkdgudrn4094.week2 + +interface TestView { + fun onTestSuccess(message: String) + fun onTestFailure() +} \ No newline at end of file diff --git a/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/User.kt b/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/User.kt index 65f8d59..b5506e9 100644 --- a/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/User.kt +++ b/backy/week4/app/src/main/java/com/rkdgudrn4094/week2/User.kt @@ -2,11 +2,13 @@ package com.rkdgudrn4094.week2 import androidx.room.Entity import androidx.room.PrimaryKey +import com.google.gson.annotations.SerializedName @Entity(tableName = "UserTable") data class User( - var email: String, - var password: String + @SerializedName(value = "name") var name: String, + @SerializedName(value = "email") var email: String, + @SerializedName(value = "password") var password: String ){ @PrimaryKey(autoGenerate = true) var id: Int = 0 -} +} \ No newline at end of file diff --git a/backy/week4/app/src/main/res/layout/activity_main.xml b/backy/week4/app/src/main/res/layout/activity_main.xml index 5fdd1fa..9df7346 100644 --- a/backy/week4/app/src/main/res/layout/activity_main.xml +++ b/backy/week4/app/src/main/res/layout/activity_main.xml @@ -93,7 +93,22 @@ + + + +