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