diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 9d2cd40..f0d4f77 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -13,7 +13,7 @@
android:theme="@style/Theme.NOWSOPTAndroid"
tools:targetApi="31">
@@ -23,6 +23,16 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/compose/LoginActivity.kt b/app/src/main/java/com/sopt/now/compose/LoginActivity.kt
new file mode 100644
index 0000000..bbe27cf
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/compose/LoginActivity.kt
@@ -0,0 +1,196 @@
+package com.sopt.now.compose
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import android.widget.Toast
+import androidx.activity.ComponentActivity
+import androidx.activity.compose.setContent
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.*
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Person
+import androidx.compose.material3.Icon
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Surface
+import androidx.compose.material3.Button
+import androidx.compose.material3.ButtonDefaults
+import androidx.compose.material3.Text
+import androidx.compose.material3.TextField
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import androidx.core.content.ContextCompat.startActivity
+import com.sopt.now.compose.ui.theme.NOWSOPTAndroidTheme
+
+class LoginActivity : ComponentActivity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ val getId = intent.getStringExtra("id") ?: ""
+ val getPassword = intent.getStringExtra("password") ?: ""
+ val getNickname = intent.getStringExtra("nickname") ?: ""
+ val getMbti = intent.getStringExtra("mbti") ?: ""
+
+ setContent {
+ LoginContent(getId, getPassword, getNickname, getMbti)
+ }
+ }
+}
+
+@Composable
+fun LoginContent(getId: String, getPassword: String, getNickname: String, getMbti: String) {
+ var isLogged by remember { mutableStateOf(false) }
+
+ if (!isLogged) {
+ SoptComposable(
+ getId = getId,
+ getPassword = getPassword,
+ getNickname = getNickname,
+ getMbti = getMbti
+ )
+ } else {
+ val context = LocalContext.current
+ context.startActivity(Intent(context, MainActivity::class.java))
+ }
+}
+
+fun isValid(userId: String?, userPassword: String?, getId: String, getPassword: String): Boolean {
+ return userId != "" && userPassword != "" && userId == getId && userPassword == getPassword
+}
+
+fun Success(context: Context, userId: String, userPassword: String, userNickname: String, userMbti: String?) {
+
+ val intent = Intent(context, MainActivity::class.java).apply {
+ putExtra("id", userId)
+ putExtra("password", userPassword)
+ putExtra("nickname", userNickname)
+ putExtra("mbti", userMbti)
+ }
+ context.startActivity(intent)
+ Toast.makeText(context, "로그인 성공!", Toast.LENGTH_SHORT).show()
+}
+
+@Composable
+fun SoptComposable(
+ getId: String,
+ getPassword: String,
+ getNickname: String,
+ getMbti: String
+
+) {
+ var userId by remember { mutableStateOf("") }
+ var userPassword by remember { mutableStateOf("") }
+ var userNickname by remember { mutableStateOf("") }
+ var userMbti by remember { mutableStateOf("") }
+
+ Column(
+ modifier = Modifier.fillMaxSize(),
+ verticalArrangement = Arrangement.Center,
+ horizontalAlignment = Alignment.CenterHorizontally
+ ) {
+ Spacer(modifier = Modifier.height(30.dp))
+
+ Text(
+ text = "Welcome To SOPT",
+ color = Color.Gray,
+ fontWeight = FontWeight.Bold,
+ fontSize = 30.sp,
+ modifier = Modifier.align(Alignment.CenterHorizontally),
+ )
+
+ // Welcome 문구와 ID 텍스트 사이의 간격
+ Spacer(modifier = Modifier.height(100.dp)) // 중간 간격을 위한 투명 view
+
+ // ID 입력하는 부분 (ID 텍스트는 좌측 정렬, 텍스트 필드는 중앙 정렬)
+ Column(verticalArrangement = Arrangement.Center) {
+ Text(text = "ID")
+
+ TextField(
+ value = userId,
+ onValueChange = { userId = it },
+ label = { Text("ID를 입력하세요") },
+ placeholder = { Text("EX) helen0816") },
+ singleLine = true,
+ )
+ }
+
+ // ID 텍스트 필드와 PASSWORD 텍스트 사이의 간격
+ Spacer(modifier = Modifier.height(50.dp)) // 중간 간격을 위한 투명 view
+
+ // PW 입력하는 부분 (PW 텍스트는 좌측 정렬, 텍스트 필드는 중앙 정렬)
+ Column(verticalArrangement = Arrangement.Center) {
+ Text(text = "PASSWORD")
+
+ TextField(
+ value = userPassword,
+ onValueChange = { userPassword = it },
+ label = { Text("PASSWORD를 입력하세요") },
+ placeholder = { Text("EX) qwaszx@!") },
+ singleLine = true,
+ )
+ }
+
+ // PW 텍스트 필드와 버튼 사이의 간격
+ Spacer(modifier = Modifier.height(250.dp)) // 중간 간격을 위한 투명 view
+
+ val context = LocalContext.current
+
+ Button(
+ onClick = { if (isValid(userId, userPassword, getId ?: "", getPassword ?: "")) {
+ Success(context, userId, userPassword, userNickname, userMbti)
+ }
+ else Toast.makeText(context, "아이디 또는 비밀번호가 일치하지 않습니다", Toast.LENGTH_SHORT).show()
+ },
+ contentPadding = PaddingValues(start = 90.dp, end = 90.dp),
+ colors = ButtonDefaults.buttonColors(
+ containerColor = Color.LightGray,
+ contentColor = Color.Black
+ )
+ ) {
+ Text(text = "로그인",
+ fontWeight = FontWeight.Bold,
+ )
+ }
+
+ Spacer(modifier = Modifier.height(10.dp))
+
+ Button(
+ onClick = {
+ val intent = Intent(context, SignupActivity::class.java)
+ context.startActivity(intent)
+ },
+ contentPadding = PaddingValues(start = 90.dp, end = 90.dp),
+ colors = ButtonDefaults.buttonColors(
+ containerColor = Color.LightGray,
+ contentColor = Color.Black
+ )
+ )
+ {
+ Text(text = "회원가입",
+ fontWeight = FontWeight.Bold,
+ )
+ }
+
+ }
+}
+@Preview(showBackground = true)
+
+@Composable
+fun LoginPreview() {
+ NOWSOPTAndroidTheme {
+ SoptComposable(getId ="", getPassword ="", getNickname = "", getMbti = "")
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/compose/MainActivity.kt b/app/src/main/java/com/sopt/now/compose/MainActivity.kt
index 73fb148..168ca7a 100644
--- a/app/src/main/java/com/sopt/now/compose/MainActivity.kt
+++ b/app/src/main/java/com/sopt/now/compose/MainActivity.kt
@@ -3,44 +3,104 @@ package com.sopt.now.compose
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
-import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.material3.MaterialTheme
-import androidx.compose.material3.Surface
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.layout.*
+import androidx.compose.material3.Button
+import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
import com.sopt.now.compose.ui.theme.NOWSOPTAndroidTheme
+import com.sopt.now.compose.ui.theme.PurpleGrey40
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
+ val id = intent.getStringExtra("id")
+ val password = intent.getStringExtra("password")
+ val nickname = intent.getStringExtra("nickname")
+
setContent {
- NOWSOPTAndroidTheme {
- // A surface container using the 'background' color from the theme
- Surface(
- modifier = Modifier.fillMaxSize(),
- color = MaterialTheme.colorScheme.background
- ) {
- Greeting("Android")
- }
- }
+ MainActivityContent(id = id ?: "", password = password ?: "", nickname = nickname?: "")
}
}
}
@Composable
-fun Greeting(name: String, modifier: Modifier = Modifier) {
- Text(
- text = "Hello $name!",
- modifier = modifier
- )
+fun MainActivityContent(id: String, password: String, nickname: String) {
+ Column(
+ modifier = Modifier
+ .fillMaxWidth()
+ .padding(16.dp),
+ verticalArrangement = Arrangement.Center,
+ horizontalAlignment = Alignment.CenterHorizontally
+ ) {
+ Image (
+ painter = painterResource(id = R.drawable.apple), // 이미지 리소스 추가
+ contentDescription = null,
+ modifier = Modifier
+ .aspectRatio(1.5f) // aspectRatio 설정
+ .padding(top = 30.dp)
+ .padding(bottom = 10.dp)
+ )
+ UserInfoComposable(id, password, nickname)
+ }
+}
+
+@Composable
+fun UserInfoComposable(id: String, password: String, nickname: String) {
+ Column(
+ modifier = Modifier.padding(16.dp),
+ verticalArrangement = Arrangement.spacedBy(8.dp)
+ ) {
+ Text(text = "안녕하세요, $id 님!\n",
+ fontSize = 24.sp,
+ fontWeight = FontWeight.ExtraBold)
+
+ Text(text = "아이디: $id \n",
+ fontSize = 18.sp,
+ fontWeight = FontWeight.Bold,
+ color = PurpleGrey40)
+
+ Text(text = "비밀번호: $password \n",
+ fontSize = 18.sp,
+ fontWeight = FontWeight.Bold,
+ color = PurpleGrey40)
+
+
+ Button(
+ onClick = { },
+
+ contentPadding = PaddingValues(start = 90.dp, end = 90.dp),
+ colors = ButtonDefaults.buttonColors(
+ containerColor = Color.LightGray,
+ contentColor = Color.Black
+ )
+ ) {
+ Text(text = "수정하기",
+ fontWeight = FontWeight.Bold,
+ )
+ }
+ }
+
}
+
@Preview(showBackground = true)
@Composable
-fun GreetingPreview() {
+fun MainPreview() {
NOWSOPTAndroidTheme {
- Greeting("Android")
+ UserInfoComposable(
+ id = "exampleId",
+ password = "examplePassword",
+ nickname = "exampleNickname"
+ )
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/sopt/now/compose/SignupActivity.kt b/app/src/main/java/com/sopt/now/compose/SignupActivity.kt
new file mode 100644
index 0000000..1ee90f3
--- /dev/null
+++ b/app/src/main/java/com/sopt/now/compose/SignupActivity.kt
@@ -0,0 +1,231 @@
+package com.sopt.now.compose
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import android.widget.Toast
+import androidx.activity.ComponentActivity
+import androidx.activity.compose.setContent
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.material3.Button
+import androidx.compose.material3.MaterialTheme
+import androidx.compose.material3.Surface
+import androidx.compose.material3.Text
+import androidx.compose.material3.TextField
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.tooling.preview.Preview
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import com.sopt.now.compose.ui.theme.NOWSOPTAndroidTheme
+
+class UserInfo(
+ val userId: String,
+ val userPassword: String,
+ val userNickname: String,
+ val userMbti: String
+)
+
+@Composable
+fun Signup () {
+ Column(
+ modifier = Modifier
+ .fillMaxSize()
+ .padding(30.dp),
+ horizontalAlignment = Alignment.CenterHorizontally,
+ )
+ {
+ var userId by remember { mutableStateOf("") }
+ var userPassword by remember { mutableStateOf("") }
+ var userNickname by remember { mutableStateOf("") }
+ var userMbti by remember { mutableStateOf("") }
+
+ Text(
+ text = "SIGN UP PAGE",
+ fontWeight = FontWeight.Bold,
+ fontSize = 30.sp,
+ modifier = Modifier.fillMaxWidth(),
+ textAlign = TextAlign.Center
+ )
+
+ Spacer(modifier = Modifier.height(30.dp))
+
+ Text(
+ text = "ID",
+ fontSize = 20.sp,
+ modifier = Modifier.fillMaxWidth(),
+ textAlign = TextAlign.Left
+ )
+
+ TextField(
+ value = userId,
+ onValueChange = { newValue -> userId = newValue },
+ modifier = Modifier
+ .fillMaxWidth(),
+ label = { Text("아이디를 입력하세요(6~10자리)") },
+ singleLine = true,
+ )
+
+ Spacer(modifier = Modifier.height(30.dp))
+
+ Text(
+ text = "PASSWORD",
+ fontSize = 20.sp,
+ modifier = Modifier.fillMaxWidth(),
+ textAlign = TextAlign.Left
+ )
+
+ TextField(
+ value = userPassword,
+ onValueChange = { newValue -> userPassword = newValue },
+ modifier = Modifier
+ .fillMaxWidth(),
+ label = { Text("비밀번호를 입력하세요(8~12자리)") },
+ singleLine = true,
+ )
+
+ Spacer(modifier = Modifier.height(30.dp))
+
+ Text(
+ text = "NICKNAME",
+ fontSize = 20.sp,
+ modifier = Modifier.fillMaxWidth(),
+ textAlign = TextAlign.Left,
+ )
+
+ TextField(
+ value = userNickname,
+ onValueChange = { newValue -> userNickname = newValue },
+ modifier = Modifier
+ .fillMaxWidth(),
+ label = { Text("닉네임을 입력하세요(공백 안됨)") },
+ singleLine = true,
+ )
+
+ Spacer(modifier = Modifier.height(30.dp))
+
+ Text(
+ text = "MBTI",
+ fontSize = 20.sp,
+ modifier = Modifier.fillMaxWidth(),
+ textAlign = TextAlign.Left,
+ )
+
+ TextField(
+ value = userMbti,
+ onValueChange = { newValue -> userMbti = newValue },
+ modifier = Modifier
+ .fillMaxWidth(),
+ label = { Text("MBTI를 입력하세요") },
+ singleLine = true,
+ )
+
+ Spacer(modifier = Modifier.height(30.dp))
+
+ val context = LocalContext.current
+
+ Button(onClick = {
+ if (CheckId(context, userId) && CheckPassword(context, userPassword) && CheckNickname(context, userNickname) && CheckMbti(context, userMbti)) {
+ val intent = Intent(context, LoginActivity::class.java).apply {
+ putExtra("id", userId)
+ putExtra("password", userPassword)
+ putExtra("nickname", userNickname)
+ putExtra("mbti", userMbti)
+ }
+ context.startActivity(intent) // 회원가입 성공 시 MainActivity로 이동
+ Toast.makeText(context, "회원가입 성공!", Toast.LENGTH_SHORT).show()
+
+ } else {
+
+ }
+ }) {
+ Text("Sign Up")
+ }
+
+ }
+}
+
+fun CheckId(context: Context, id: String): Boolean {
+ if (id.length >= 6 && id.length <= 10) {
+ return true
+ } else {
+ Toast.makeText(context, "ID는 6자 이상, 10자 이하로 입력해주세요", Toast.LENGTH_SHORT).show()
+ return false
+ }
+}
+
+fun CheckPassword(context: Context, password: String): Boolean {
+ if(password.length >= 8 && password.length <= 12){
+ return true
+ }
+ else {
+ Toast.makeText(context, "PASSWORD는 8자 이상, 12자 이하로 입력해주세요", Toast.LENGTH_SHORT).show()
+ return false
+ }
+}
+
+fun CheckNickname(context: Context, nickname: String): Boolean {
+ if (nickname.isNotBlank() && nickname.length > 1) {
+ return true
+ } else {
+ Toast.makeText(context, "닉네임은 2자 이상의 유효한 문자로 입력해주세요", Toast.LENGTH_SHORT).show()
+ return false
+ }
+}
+fun CheckMbti(context: Context, mbti: String): Boolean {
+ if ((mbti.length == 4)
+ && (mbti[0].uppercase() == "E" || mbti[0].uppercase() == "I")
+ && (mbti[1].uppercase() == "S" || mbti[1].uppercase() == "N")
+ && (mbti[2].uppercase() == "F" || mbti[2].uppercase() == "T")
+ && (mbti[3].uppercase() == "P" || mbti[3].uppercase() == "J")
+ )
+ return true
+ else {
+ Toast.makeText(context, "MBTI를 제대로 입력해주세요(ex. ENTJ)", Toast.LENGTH_SHORT).show()
+ return false
+ }
+}
+class SignupActivity : ComponentActivity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ setContent {
+ NOWSOPTAndroidTheme {
+ // A surface container using the 'background' color from the theme
+ Surface(
+ modifier = Modifier.fillMaxSize(),
+ color = MaterialTheme.colorScheme.background
+ ) {
+ Signup()
+ }
+ }
+ }
+ }
+}
+
+
+@Preview(showBackground = true)
+@Composable
+fun SignupPreview() {
+ NOWSOPTAndroidTheme {
+ Surface(
+ modifier = Modifier.fillMaxSize(),
+ color = MaterialTheme.colorScheme.background
+ ){
+ Signup()
+ }
+ }
+}
diff --git a/app/src/main/res/drawable/apple.png b/app/src/main/res/drawable/apple.png
new file mode 100644
index 0000000..7b77abd
Binary files /dev/null and b/app/src/main/res/drawable/apple.png differ