diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml
index 927be84..30c6c2a 100644
--- a/.idea/deploymentTargetSelector.xml
+++ b/.idea/deploymentTargetSelector.xml
@@ -4,24 +4,15 @@
-
+
-
+
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
deleted file mode 100644
index 94a25f7..0000000
--- a/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 98dadd9..8d6df26 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -5,7 +5,7 @@ configurations.all {
plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.android)
- id("com.google.gms.google-services")
+ id("com.google.gms.google-services") version "4.4.2" apply false
}
android {
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index a6beb8b..2845fd9 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -23,7 +23,7 @@
>
@@ -33,6 +33,11 @@
+
+
+
diff --git a/app/src/main/java/com/example/iamhere/LoginActivity.kt b/app/src/main/java/com/example/iamhere/LoginActivity.kt
new file mode 100644
index 0000000..7e461ae
--- /dev/null
+++ b/app/src/main/java/com/example/iamhere/LoginActivity.kt
@@ -0,0 +1,17 @@
+package com.example.iamhere
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import com.example.iamhere.ui.login.LoginFragment
+
+class LoginActivity : AppCompatActivity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_login) // 로그인 레이아웃 연결
+
+ // 처음 실행 시 LoginFragment 띄우기
+ supportFragmentManager.beginTransaction()
+ .replace(R.id.fragment_container, LoginFragment())
+ .commit()
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/iamhere/MainActivity.kt b/app/src/main/java/com/example/iamhere/MainActivity.kt
index c92a812..304f3e0 100644
--- a/app/src/main/java/com/example/iamhere/MainActivity.kt
+++ b/app/src/main/java/com/example/iamhere/MainActivity.kt
@@ -21,6 +21,9 @@ class MainActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
+
+
+ Log.d("MainActivity", "MainActivity 실행됨")
val navView = findViewById(R.id.nav_view)
val navHostFragment = supportFragmentManager
.findFragmentById(R.id.nav_host_fragment_activity_main) as NavHostFragment
diff --git a/app/src/main/java/com/example/iamhere/model/LoginRequest.kt b/app/src/main/java/com/example/iamhere/model/LoginRequest.kt
new file mode 100644
index 0000000..e262838
--- /dev/null
+++ b/app/src/main/java/com/example/iamhere/model/LoginRequest.kt
@@ -0,0 +1,7 @@
+package com.example.iamhere.model
+
+data class LoginRequest(
+ val login_id: String,
+ val password: String,
+ val userType: String
+)
diff --git a/app/src/main/java/com/example/iamhere/model/LoginResponse.kt b/app/src/main/java/com/example/iamhere/model/LoginResponse.kt
new file mode 100644
index 0000000..490d76e
--- /dev/null
+++ b/app/src/main/java/com/example/iamhere/model/LoginResponse.kt
@@ -0,0 +1,20 @@
+package com.example.iamhere.model
+
+import com.google.gson.annotations.SerializedName
+
+data class LoginResponse(
+ @SerializedName("access_token")
+ val accessToken: String,
+
+ @SerializedName("token_type")
+ val tokenType: String,
+
+ @SerializedName("user_name")
+ val userName: String,
+
+ @SerializedName("user_id") //not login_id!
+ val userId: String,
+
+ @SerializedName("today_attendance")
+ val today_attendance: TodayLecture? // Optional 처리
+)
diff --git a/app/src/main/java/com/example/iamhere/network/LoginApi.kt b/app/src/main/java/com/example/iamhere/network/LoginApi.kt
new file mode 100644
index 0000000..20ec23a
--- /dev/null
+++ b/app/src/main/java/com/example/iamhere/network/LoginApi.kt
@@ -0,0 +1,14 @@
+package com.example.iamhere.network
+
+import com.example.iamhere.model.LoginRequest
+import com.example.iamhere.model.LoginResponse
+import retrofit2.Call
+
+import retrofit2.http.Body
+import retrofit2.http.POST
+
+interface LoginApi {
+ @POST("login") // 실제 서버 주소 경로에 맞게 수정
+ suspend fun login(@Body request: LoginRequest): LoginResponse //suspend로 비동기 처리
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/iamhere/network/RetrofitClient.kt b/app/src/main/java/com/example/iamhere/network/RetrofitClient.kt
index 09bbaaf..7d0adb4 100644
--- a/app/src/main/java/com/example/iamhere/network/RetrofitClient.kt
+++ b/app/src/main/java/com/example/iamhere/network/RetrofitClient.kt
@@ -4,8 +4,12 @@ import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
object RetrofitClient {
+
private const val BASE_URL = "http://34.64.121.178:8000/" // ← 예시 GCP IP
+ //private const val BASE_URL = "http://10.0.2.2:8000/" //실제 디바이스의 경우 네트워크의 로컬 ip가필요
+ //private const val BASE_URL = "http://192.168.219.109:8000/"
+
val attendanceApi: AttendanceApi by lazy {
Retrofit.Builder()
.baseUrl(BASE_URL)
@@ -13,4 +17,12 @@ object RetrofitClient {
.build()
.create(AttendanceApi::class.java)
}
+ // loginApi 초기화
+ val loginApi: LoginApi by lazy {
+ Retrofit.Builder() // Retrofit 객체 다시 생성
+ .baseUrl(BASE_URL) // 기본 URL 설정
+ .addConverterFactory(GsonConverterFactory.create()) // GsonConverterFactory 추가
+ .build()
+ .create(LoginApi::class.java) // LoginApi 인터페이스 구현
+ }
}
diff --git a/app/src/main/java/com/example/iamhere/ui/login/LoginFragment.kt b/app/src/main/java/com/example/iamhere/ui/login/LoginFragment.kt
new file mode 100644
index 0000000..4b415ac
--- /dev/null
+++ b/app/src/main/java/com/example/iamhere/ui/login/LoginFragment.kt
@@ -0,0 +1,96 @@
+package com.example.iamhere.ui.login
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.Button
+import android.widget.EditText
+import android.widget.Toast
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.viewModels
+import com.example.iamhere.R
+import android.content.Intent
+import android.util.Log
+import androidx.appcompat.app.AppCompatActivity
+import androidx.lifecycle.lifecycleScope
+
+import com.example.iamhere.MainActivity
+import com.example.iamhere.model.LoginRequest
+import com.example.iamhere.model.LoginResponse
+import com.example.iamhere.network.RetrofitClient
+import kotlinx.coroutines.launch
+import retrofit2.Call
+import retrofit2.Callback
+import retrofit2.Response
+
+class LoginFragment : Fragment() {
+
+ private val viewModel: LoginViewModel by viewModels()
+
+ @SuppressLint("MissingInflatedId")
+ override fun onCreateView(
+ inflater: LayoutInflater, container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View {
+ val view = inflater.inflate(R.layout.fragment_login, container, false)
+
+ val studentButton = view.findViewById