diff --git a/AndroidAssignment/app/src/main/java/org/sopt/androidassignment/HomeActivity.kt b/AndroidAssignment/app/src/main/java/org/sopt/androidassignment/HomeActivity.kt deleted file mode 100644 index 8edffeb..0000000 --- a/AndroidAssignment/app/src/main/java/org/sopt/androidassignment/HomeActivity.kt +++ /dev/null @@ -1,39 +0,0 @@ -package org.sopt.androidassignment - -import android.content.ActivityNotFoundException -import android.content.Intent -import android.content.Intent.createChooser -import android.net.Uri -import androidx.appcompat.app.AppCompatActivity -import android.os.Bundle -import android.widget.Toast -import org.sopt.androidassignment.databinding.ActivityHomeBinding - - -class HomeActivity : AppCompatActivity() { - - private lateinit var binding : ActivityHomeBinding - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - binding = ActivityHomeBinding.inflate(layoutInflater) - val address : Intent = Uri.parse("https://github.com/briandr97").let{webpage->Intent(Intent.ACTION_VIEW, webpage)} - - //val webIntent = Intent(Intent.ACTION_VIEW, Uri.parse("https://github.com/briandr97")) - - - binding.btHomeGit.setOnClickListener{ - //val intent = Intent(Intent.ACTION_SEND) - //val title = resources.getString(R.string.chooser_title) - //val chooser = createChooser(intent, title) - try{ - startActivity(address) - }catch(e:ActivityNotFoundException){ - Toast.makeText(this, "실행할 수 있는 앱이 없습니다.", Toast.LENGTH_SHORT).show() - } - } - - setContentView(binding.root) - } -} \ No newline at end of file diff --git a/AndroidAssignment/app/src/main/java/org/sopt/androidassignment/SignInActivity.kt b/AndroidAssignment/app/src/main/java/org/sopt/androidassignment/SignInActivity.kt deleted file mode 100644 index f62663f..0000000 --- a/AndroidAssignment/app/src/main/java/org/sopt/androidassignment/SignInActivity.kt +++ /dev/null @@ -1,46 +0,0 @@ -package org.sopt.androidassignment - -import android.content.Intent -import androidx.appcompat.app.AppCompatActivity -import android.os.Bundle -import android.widget.Toast -import org.sopt.androidassignment.databinding.ActivitySignInBinding - -class SignInActivity : AppCompatActivity() { - - private lateinit var binding : ActivitySignInBinding - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - binding = ActivitySignInBinding.inflate(layoutInflater) - - val intent = Intent(this, HomeActivity::class.java) - binding.btLogin.setOnClickListener{ - var str = binding.etId.getText() - var pw = binding.etPw.getText() - if(!str.isEmpty() && !pw.isEmpty()){ - Toast.makeText(this, "${str}님 환영합니다.", Toast.LENGTH_SHORT).show() - startActivity(intent) - } - else{ - Toast.makeText(this, "로그인 실패", Toast.LENGTH_SHORT).show() - } - } - - val intent2 = Intent(this, SignUpActivity::class.java) - binding.btSignin.setOnClickListener{ - startActivity(intent2) - } - - val id = getIntent().getStringExtra("id") - val pw = getIntent().getStringExtra("pw") - - binding.etId.setText(id) - binding.etPw.setText(pw) - - - - setContentView(binding.root) - } -} \ No newline at end of file diff --git a/AndroidAssignment/app/src/main/res/drawable/button_round.xml b/AndroidAssignment/app/src/main/res/drawable/button_round.xml deleted file mode 100644 index db46f6b..0000000 --- a/AndroidAssignment/app/src/main/res/drawable/button_round.xml +++ /dev/null @@ -1,16 +0,0 @@ - - //10만큼 각모서리에 - - - - //내부 색 설정 - //각 모서리를 12dp만큼 둥글게 만들겠다ㅣ. - - \ No newline at end of file diff --git a/AndroidAssignment/app/src/main/res/layout/activity_home.xml b/AndroidAssignment/app/src/main/res/layout/activity_home.xml deleted file mode 100644 index 60b6327..0000000 --- a/AndroidAssignment/app/src/main/res/layout/activity_home.xml +++ /dev/null @@ -1,225 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - / - - \ No newline at end of file diff --git a/AndroidAssignment/app/src/main/res/values/strings.xml b/AndroidAssignment/app/src/main/res/values/strings.xml deleted file mode 100644 index 48936d3..0000000 --- a/AndroidAssignment/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - AndroidAssignment - \ No newline at end of file diff --git a/AndroidAssignment/.gitignore b/again/.gitignore similarity index 100% rename from AndroidAssignment/.gitignore rename to again/.gitignore diff --git a/AndroidAssignment/.idea/.gitignore b/again/.idea/.gitignore similarity index 100% rename from AndroidAssignment/.idea/.gitignore rename to again/.idea/.gitignore diff --git a/again/.idea/.name b/again/.idea/.name new file mode 100644 index 0000000..a31b82f --- /dev/null +++ b/again/.idea/.name @@ -0,0 +1 @@ +AgainAssignment \ No newline at end of file diff --git a/AndroidAssignment/.idea/compiler.xml b/again/.idea/compiler.xml similarity index 100% rename from AndroidAssignment/.idea/compiler.xml rename to again/.idea/compiler.xml diff --git a/AndroidAssignment/.idea/gradle.xml b/again/.idea/gradle.xml similarity index 100% rename from AndroidAssignment/.idea/gradle.xml rename to again/.idea/gradle.xml diff --git a/AndroidAssignment/.idea/misc.xml b/again/.idea/misc.xml similarity index 53% rename from AndroidAssignment/.idea/misc.xml rename to again/.idea/misc.xml index 831c5f5..3f1e257 100644 --- a/AndroidAssignment/.idea/misc.xml +++ b/again/.idea/misc.xml @@ -3,21 +3,21 @@ diff --git a/again/.idea/vcs.xml b/again/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/again/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/again/README.md b/again/README.md new file mode 100644 index 0000000..8e25dfd --- /dev/null +++ b/again/README.md @@ -0,0 +1,102 @@ +### 4주차 필수과제 리드미 +먼저 3주차 과제를 오류로 실패하여 모든 것을 처음부터 새로 만들었습니다.
+그래서 맨 처음 화면인 로그인 화면과 회원가입 화면만 제대로 구성했고 로그인하면 나오는 화면은 제대로 제대로 구현하지 않았습니다.
+### 회원가입 화면 +
+### 로그인 성공 화면 +
+### 로그인 실패 화면 +
+
+먼저 로그인 부분은 세미나에서 했던 그대로 했습니다.(액티비티 이름만 바꿔주었습니다.)
+그리고 로그인 부분을 응용해서 회원가입 부분을 만들었습니다.
+회원가입에 사용될 RequestData파일과 ResponseData파일을 새로 만들고
+_RequestData파일_
+``` +data class RequestSignupData( + @SerializedName("email") + val id: String, + val name: String, + val password: String +) +``` +_ResponseData파일_
+``` +data class ResponseSignupData( + val status: Int, + val success: Boolean, + val message: String, + val data: Data2 +) + +data class Data2( + val id: Int, + val name: String, + val email: String +) +``` +근데 Response파일은 로그인 할 때나 회원가입할 때나 같은데 그냥 하나로 쓰면 안되나..?라는 궁금증이 갑자기 리드미 쓰면서 생기네요
+
+그리고 회원가입에 대한 interface를 만들었습니다.
+``` +interface SignUp { + @Headers("Content-Type:application/json") + @POST("user/signup") + fun postSignup( + @Body body : RequestSignupData + ) : Call +} +``` +
+그리고 생성자에 val signup을 선언합니다.
+ +``` +object ServiceCreator { + private const val BASE_URL = "https://asia-northeast3-we-sopt-29.cloudfunctions.net/api/" + + private val retrofit : Retrofit = Retrofit.Builder() + .baseUrl(BASE_URL) + .addConverterFactory(GsonConverterFactory.create()) + .build() + + val sampleService: SampleService = retrofit.create(SampleService::class.java) + val signup : SignUp = retrofit.create(SignUp::class.java) +} +``` +
+회원가입 액티비티에서 사용할 initNetWork 함수를 만들었습니다.
+사실 로그인에서 사용했던 것에서 name만 추가하고 이름만 바꿔주면 됩니다,,
+ +``` +private fun initNetwork(){ + val requestSignupData = RequestSignupData( + id = binding.etSignupId.text.toString(), + name = binding.etSignupName.text.toString(), + password = binding.etSignupPw.text.toString() + ) + + val call: Call = ServiceCreator.signup.postSignup(requestSignupData) + + call.enqueue(object: Callback { + override fun onResponse( + call: Call, + response: Response + ) { + if(response.isSuccessful){ + val data = response.body()?.data + + Toast.makeText(this@SignUpActivity, "${data?.email}님 회원가입 되었습니다!", Toast.LENGTH_SHORT).show() + finish() + } else + Toast.makeText(this@SignUpActivity, "회원가입에 실패하셨습니다", Toast.LENGTH_SHORT).show() + } + + override fun onFailure(call: Call, t: Throwable) { + Log.e("NetWorkTest", "error:$t") + } + }) + } +``` +
++추가로 postman 이미지입니당,,
+
\ No newline at end of file diff --git a/AndroidAssignment/app/.gitignore b/again/app/.gitignore similarity index 100% rename from AndroidAssignment/app/.gitignore rename to again/app/.gitignore diff --git a/again/app/build.gradle b/again/app/build.gradle new file mode 100644 index 0000000..e877752 --- /dev/null +++ b/again/app/build.gradle @@ -0,0 +1,57 @@ +plugins { + id 'com.android.application' + id 'kotlin-android' +} + +android { + compileSdk 31 + + defaultConfig { + applicationId "org.sopt.study.againassignment" + minSdk 26 + targetSdk 31 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildFeatures{ + viewBinding true + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = '1.8' + } +} + +dependencies { + + // 서버 연결을 위한 Retrofit2 + implementation "com.squareup.retrofit2:retrofit:2.9.0" + // Retrofit2에서 gson 사용을 위한 컨버터 + implementation "com.squareup.retrofit2:converter-gson:2.9.0" + // gson + implementation "com.google.code.gson:gson:2.8.6" + + implementation 'androidx.core:core-ktx:1.7.0' + implementation 'androidx.appcompat:appcompat:1.3.1' + implementation 'com.google.android.material:material:1.4.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.1' + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5' + implementation 'androidx.navigation:navigation-ui-ktx:2.3.5' + testImplementation 'junit:junit:4.+' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' +} \ No newline at end of file diff --git a/AndroidAssignment/app/proguard-rules.pro b/again/app/proguard-rules.pro similarity index 100% rename from AndroidAssignment/app/proguard-rules.pro rename to again/app/proguard-rules.pro diff --git a/again/app/src/androidTest/java/org/sopt/study/againassignment/ExampleInstrumentedTest.kt b/again/app/src/androidTest/java/org/sopt/study/againassignment/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..26140b7 --- /dev/null +++ b/again/app/src/androidTest/java/org/sopt/study/againassignment/ExampleInstrumentedTest.kt @@ -0,0 +1,24 @@ +package org.sopt.study.againassignment + +import androidx.test.platform.app.InstrumentationRegistry +import androidx.test.ext.junit.runners.AndroidJUnit4 + +import org.junit.Test +import org.junit.runner.RunWith + +import org.junit.Assert.* + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("org.sopt.study.againassignment", appContext.packageName) + } +} \ No newline at end of file diff --git a/again/app/src/main/AndroidManifest.xml b/again/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..ab79d72 --- /dev/null +++ b/again/app/src/main/AndroidManifest.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/again/app/src/main/java/org/sopt/study/againassignment/First2Fragment.kt b/again/app/src/main/java/org/sopt/study/againassignment/First2Fragment.kt new file mode 100644 index 0000000..f3f3bb3 --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/First2Fragment.kt @@ -0,0 +1,44 @@ +package org.sopt.study.againassignment + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.navigation.fragment.findNavController +import org.sopt.study.againassignment.databinding.FragmentFirst2Binding + +/** + * A simple [Fragment] subclass as the default destination in the navigation. + */ +class First2Fragment : Fragment() { + + private var _binding: FragmentFirst2Binding? = null + + // This property is only valid between onCreateView and + // onDestroyView. + private val binding get() = _binding!! + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + + _binding = FragmentFirst2Binding.inflate(inflater, container, false) + return binding.root + + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + binding.buttonFirst.setOnClickListener { + findNavController().navigate(R.id.action_First2Fragment_to_Second2Fragment) + } + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/again/app/src/main/java/org/sopt/study/againassignment/FirstFragment.kt b/again/app/src/main/java/org/sopt/study/againassignment/FirstFragment.kt new file mode 100644 index 0000000..0e0a1bd --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/FirstFragment.kt @@ -0,0 +1,44 @@ +package org.sopt.study.againassignment + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.navigation.fragment.findNavController +import org.sopt.study.againassignment.databinding.FragmentFirstBinding + +/** + * A simple [Fragment] subclass as the default destination in the navigation. + */ +class FirstFragment : Fragment() { + + private var _binding: FragmentFirstBinding? = null + + // This property is only valid between onCreateView and + // onDestroyView. + private val binding get() = _binding!! + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + + _binding = FragmentFirstBinding.inflate(inflater, container, false) + return binding.root + + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + binding.buttonFirst.setOnClickListener { + findNavController().navigate(R.id.action_FirstFragment_to_SecondFragment) + } + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/again/app/src/main/java/org/sopt/study/againassignment/FollowerAdapter.kt b/again/app/src/main/java/org/sopt/study/againassignment/FollowerAdapter.kt new file mode 100644 index 0000000..6408424 --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/FollowerAdapter.kt @@ -0,0 +1,36 @@ +package org.sopt.study.againassignment + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import org.sopt.study.againassignment.databinding.ItemSampleListBinding + +class FollowerAdapter : RecyclerView.Adapter() { + val userList = mutableListOf() + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): FollowerAdapter.FollowerViewHolder { + val binding = ItemSampleListBinding.inflate( + LayoutInflater.from(parent.context), + parent, false + ) + + return FollowerViewHolder(binding) + } + + override fun onBindViewHolder(holder: FollowerAdapter.FollowerViewHolder, position: Int) { + holder.onBind(userList[position]) + } + + override fun getItemCount(): Int = userList.size + + class FollowerViewHolder(private val binding: ItemSampleListBinding) + :RecyclerView.ViewHolder(binding.root){ + fun onBind(data : UserData){ + binding.tvName.text = data.name + binding.tvIntroduce.text=data.introduction + } + } +} \ No newline at end of file diff --git a/again/app/src/main/java/org/sopt/study/againassignment/HomeActivity.kt b/again/app/src/main/java/org/sopt/study/againassignment/HomeActivity.kt new file mode 100644 index 0000000..44c706f --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/HomeActivity.kt @@ -0,0 +1,46 @@ +package org.sopt.study.againassignment + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import org.sopt.study.againassignment.databinding.ActivityHomeBinding + +class HomeActivity : AppCompatActivity() { + private var position = FIRST_POSITION + private lateinit var binding: ActivityHomeBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + binding = ActivityHomeBinding.inflate(layoutInflater) + initTransactionEvent() + setContentView(binding.root) + } + + private fun initTransactionEvent(){ + val fragment1 = SampleFragment1() + val fragment2 = SampleFragment2() + + supportFragmentManager.beginTransaction().add(R.id.container_main, fragment1).commit() + + binding.btChange.setOnClickListener{ + val transaction = supportFragmentManager.beginTransaction() + + when(position){ + FIRST_POSITION->{ + transaction.replace(R.id.container_main, fragment2) + position = SECOND_POSITION + } + SECOND_POSITION->{ + transaction.replace(R.id.container_main, fragment1) + position= FIRST_POSITION + } + } + transaction.commit() + } + } + + companion object{ + const val FIRST_POSITION=1 + const val SECOND_POSITION=2 + } +} \ No newline at end of file diff --git a/again/app/src/main/java/org/sopt/study/againassignment/MainActivity.kt b/again/app/src/main/java/org/sopt/study/againassignment/MainActivity.kt new file mode 100644 index 0000000..1716e94 --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/MainActivity.kt @@ -0,0 +1,61 @@ +package org.sopt.study.againassignment + +import android.app.DownloadManager +import android.content.Intent +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.util.Log +import android.widget.Toast +import org.sopt.study.againassignment.databinding.ActivityMainBinding +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response + +class MainActivity : AppCompatActivity() { + lateinit var binding : ActivityMainBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityMainBinding.inflate(layoutInflater) + + val intent = Intent(this, SignUpActivity::class.java) + + binding.tvLoginSignUp.setOnClickListener{ + startActivity(intent) + } + + binding.btLogin.setOnClickListener{ + initNetwork() + } + + setContentView(binding.root) + } + + private fun initNetwork(){ + val requestLoginData = RequestLoginData( + id = binding.etLoginId.text.toString(), + password = binding.etLoginPw.text.toString() + ) + + val call: Call = ServiceCreator.sampleService.postLogin(requestLoginData) + + call.enqueue(object:Callback { + override fun onResponse( + call: Call, + response: Response + ) { + if(response.isSuccessful){ + val data = response.body()?.data + + Toast.makeText(this@MainActivity, "${data?.email}님 반갑습니다!", Toast.LENGTH_SHORT).show() + startActivity(Intent(this@MainActivity, HomeActivity::class.java)) + } else + Toast.makeText(this@MainActivity, "로그인에 실패하셨습니다", Toast.LENGTH_SHORT).show() + } + + override fun onFailure(call: Call, t: Throwable) { + Log.e("NetWorkTest", "error:$t") + } + }) + } +} \ No newline at end of file diff --git a/again/app/src/main/java/org/sopt/study/againassignment/RequestLoginData.kt b/again/app/src/main/java/org/sopt/study/againassignment/RequestLoginData.kt new file mode 100644 index 0000000..73b2928 --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/RequestLoginData.kt @@ -0,0 +1,9 @@ +package org.sopt.study.againassignment + +import com.google.gson.annotations.SerializedName + +data class RequestLoginData( + @SerializedName("email") + val id: String, + val password: String +) diff --git a/again/app/src/main/java/org/sopt/study/againassignment/RequestSignupData.kt b/again/app/src/main/java/org/sopt/study/againassignment/RequestSignupData.kt new file mode 100644 index 0000000..98088ed --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/RequestSignupData.kt @@ -0,0 +1,10 @@ +package org.sopt.study.againassignment + +import com.google.gson.annotations.SerializedName + +data class RequestSignupData( + @SerializedName("email") + val id: String, + val name: String, + val password: String +) diff --git a/again/app/src/main/java/org/sopt/study/againassignment/ResponseLoginData.kt b/again/app/src/main/java/org/sopt/study/againassignment/ResponseLoginData.kt new file mode 100644 index 0000000..5cf1e5c --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/ResponseLoginData.kt @@ -0,0 +1,14 @@ +package org.sopt.study.againassignment + +data class ResponseLoginData( + val status: Int, + val success: Boolean, + val message: String, + val data: Data +) + +data class Data( + val id: Int, + val name: String, + val email: String +) diff --git a/again/app/src/main/java/org/sopt/study/againassignment/ResponseSignupData.kt b/again/app/src/main/java/org/sopt/study/againassignment/ResponseSignupData.kt new file mode 100644 index 0000000..35f398c --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/ResponseSignupData.kt @@ -0,0 +1,14 @@ +package org.sopt.study.againassignment + +data class ResponseSignupData( + val status: Int, + val success: Boolean, + val message: String, + val data: Data2 +) + +data class Data2( + val id: Int, + val name: String, + val email: String +) diff --git a/again/app/src/main/java/org/sopt/study/againassignment/SampleFragment1.kt b/again/app/src/main/java/org/sopt/study/againassignment/SampleFragment1.kt new file mode 100644 index 0000000..c197000 --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/SampleFragment1.kt @@ -0,0 +1,27 @@ +package org.sopt.study.againassignment + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import org.sopt.study.againassignment.databinding.FragmentSample1Binding + +class SampleFragment1 : Fragment() { + private var _binding: FragmentSample1Binding? = null + private val binding get() = _binding ?: error("Binding이 초기화 되지 않았습니다.") + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + _binding = FragmentSample1Binding.inflate(layoutInflater, container, false) + return binding.root + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/again/app/src/main/java/org/sopt/study/againassignment/SampleFragment2.kt b/again/app/src/main/java/org/sopt/study/againassignment/SampleFragment2.kt new file mode 100644 index 0000000..0ded41c --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/SampleFragment2.kt @@ -0,0 +1,29 @@ +package org.sopt.study.againassignment + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import org.sopt.study.againassignment.databinding.FragmentSample1Binding +import org.sopt.study.againassignment.databinding.FragmentSample2Binding + + +class SampleFragment2 : Fragment() { + + private var _binding: FragmentSample2Binding? = null + private val binding get() = _binding ?: error("Binding이 초기화 되지 않았습니다.") + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + _binding = FragmentSample2Binding.inflate(layoutInflater, container, false) + return binding.root + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/again/app/src/main/java/org/sopt/study/againassignment/SampleService.kt b/again/app/src/main/java/org/sopt/study/againassignment/SampleService.kt new file mode 100644 index 0000000..34c807a --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/SampleService.kt @@ -0,0 +1,14 @@ +package org.sopt.study.againassignment + +import retrofit2.Call +import retrofit2.http.Body +import retrofit2.http.Headers +import retrofit2.http.POST + +interface SampleService { + @Headers("Content-Type:application/json") + @POST("user/login") + fun postLogin( + @Body body : RequestLoginData + ) : Call +} \ No newline at end of file diff --git a/again/app/src/main/java/org/sopt/study/againassignment/Second2Fragment.kt b/again/app/src/main/java/org/sopt/study/againassignment/Second2Fragment.kt new file mode 100644 index 0000000..14c3477 --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/Second2Fragment.kt @@ -0,0 +1,44 @@ +package org.sopt.study.againassignment + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.navigation.fragment.findNavController +import org.sopt.study.againassignment.databinding.FragmentSecond2Binding + +/** + * A simple [Fragment] subclass as the second destination in the navigation. + */ +class Second2Fragment : Fragment() { + + private var _binding: FragmentSecond2Binding? = null + + // This property is only valid between onCreateView and + // onDestroyView. + private val binding get() = _binding!! + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + + _binding = FragmentSecond2Binding.inflate(inflater, container, false) + return binding.root + + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + binding.buttonSecond.setOnClickListener { + findNavController().navigate(R.id.action_Second2Fragment_to_First2Fragment) + } + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/again/app/src/main/java/org/sopt/study/againassignment/SecondFragment.kt b/again/app/src/main/java/org/sopt/study/againassignment/SecondFragment.kt new file mode 100644 index 0000000..21392ac --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/SecondFragment.kt @@ -0,0 +1,44 @@ +package org.sopt.study.againassignment + +import android.os.Bundle +import androidx.fragment.app.Fragment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.navigation.fragment.findNavController +import org.sopt.study.againassignment.databinding.FragmentSecondBinding + +/** + * A simple [Fragment] subclass as the second destination in the navigation. + */ +class SecondFragment : Fragment() { + + private var _binding: FragmentSecondBinding? = null + + // This property is only valid between onCreateView and + // onDestroyView. + private val binding get() = _binding!! + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + + _binding = FragmentSecondBinding.inflate(inflater, container, false) + return binding.root + + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + binding.buttonSecond.setOnClickListener { + findNavController().navigate(R.id.action_SecondFragment_to_FirstFragment) + } + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/again/app/src/main/java/org/sopt/study/againassignment/ServiceCreator.kt b/again/app/src/main/java/org/sopt/study/againassignment/ServiceCreator.kt new file mode 100644 index 0000000..de4f181 --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/ServiceCreator.kt @@ -0,0 +1,16 @@ +package org.sopt.study.againassignment + +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory + +object ServiceCreator { + private const val BASE_URL = "https://asia-northeast3-we-sopt-29.cloudfunctions.net/api/" + + private val retrofit : Retrofit = Retrofit.Builder() + .baseUrl(BASE_URL) + .addConverterFactory(GsonConverterFactory.create()) + .build() + + val sampleService: SampleService = retrofit.create(SampleService::class.java) + val signup : SignUp = retrofit.create(SignUp::class.java) +} \ No newline at end of file diff --git a/again/app/src/main/java/org/sopt/study/againassignment/SignUp.kt b/again/app/src/main/java/org/sopt/study/againassignment/SignUp.kt new file mode 100644 index 0000000..de9e395 --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/SignUp.kt @@ -0,0 +1,14 @@ +package org.sopt.study.againassignment + +import retrofit2.Call +import retrofit2.http.Body +import retrofit2.http.Headers +import retrofit2.http.POST + +interface SignUp { + @Headers("Content-Type:application/json") + @POST("user/signup") + fun postSignup( + @Body body : RequestSignupData + ) : Call +} \ No newline at end of file diff --git a/again/app/src/main/java/org/sopt/study/againassignment/SignUpActivity.kt b/again/app/src/main/java/org/sopt/study/againassignment/SignUpActivity.kt new file mode 100644 index 0000000..87c24e7 --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/SignUpActivity.kt @@ -0,0 +1,53 @@ +package org.sopt.study.againassignment + +import android.content.Intent +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.util.Log +import android.widget.Toast +import org.sopt.study.againassignment.databinding.ActivitySignUpBinding +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response + +class SignUpActivity : AppCompatActivity() { + lateinit var binding : ActivitySignUpBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivitySignUpBinding.inflate(layoutInflater) + binding.btSignup.setOnClickListener{ + initNetwork() + } + setContentView(binding.root) + } + + private fun initNetwork(){ + val requestSignupData = RequestSignupData( + id = binding.etSignupId.text.toString(), + name = binding.etSignupName.text.toString(), + password = binding.etSignupPw.text.toString() + ) + + val call: Call = ServiceCreator.signup.postSignup(requestSignupData) + + call.enqueue(object: Callback { + override fun onResponse( + call: Call, + response: Response + ) { + if(response.isSuccessful){ + val data = response.body()?.data + + Toast.makeText(this@SignUpActivity, "${data?.email}님 회원가입 되었습니다!", Toast.LENGTH_SHORT).show() + finish() + } else + Toast.makeText(this@SignUpActivity, "회원가입에 실패하셨습니다", Toast.LENGTH_SHORT).show() + } + + override fun onFailure(call: Call, t: Throwable) { + Log.e("NetWorkTest", "error:$t") + } + }) + } +} \ No newline at end of file diff --git a/again/app/src/main/java/org/sopt/study/againassignment/UserData.kt b/again/app/src/main/java/org/sopt/study/againassignment/UserData.kt new file mode 100644 index 0000000..d31d7c8 --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/UserData.kt @@ -0,0 +1,6 @@ +package org.sopt.study.againassignment + +data class UserData( + val name : String, + val introduction : String +) diff --git a/again/app/src/main/res/drawable-hdpi/img_github.png b/again/app/src/main/res/drawable-hdpi/img_github.png new file mode 100644 index 0000000..47d97f6 Binary files /dev/null and b/again/app/src/main/res/drawable-hdpi/img_github.png differ diff --git a/again/app/src/main/res/drawable-mdpi/img_github.png b/again/app/src/main/res/drawable-mdpi/img_github.png new file mode 100644 index 0000000..4bdd212 Binary files /dev/null and b/again/app/src/main/res/drawable-mdpi/img_github.png differ diff --git a/AndroidAssignment/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/again/app/src/main/res/drawable-v24/ic_launcher_foreground.xml similarity index 100% rename from AndroidAssignment/app/src/main/res/drawable-v24/ic_launcher_foreground.xml rename to again/app/src/main/res/drawable-v24/ic_launcher_foreground.xml diff --git a/again/app/src/main/res/drawable-v24/myface.jpg b/again/app/src/main/res/drawable-v24/myface.jpg new file mode 100644 index 0000000..da1fd50 Binary files /dev/null and b/again/app/src/main/res/drawable-v24/myface.jpg differ diff --git a/again/app/src/main/res/drawable-xhdpi/img_github.png b/again/app/src/main/res/drawable-xhdpi/img_github.png new file mode 100644 index 0000000..2d0ad82 Binary files /dev/null and b/again/app/src/main/res/drawable-xhdpi/img_github.png differ diff --git a/again/app/src/main/res/drawable-xxhdpi/img_github.png b/again/app/src/main/res/drawable-xxhdpi/img_github.png new file mode 100644 index 0000000..a20bd43 Binary files /dev/null and b/again/app/src/main/res/drawable-xxhdpi/img_github.png differ diff --git a/again/app/src/main/res/drawable-xxxhdpi/img_github.png b/again/app/src/main/res/drawable-xxxhdpi/img_github.png new file mode 100644 index 0000000..3c21de6 Binary files /dev/null and b/again/app/src/main/res/drawable-xxxhdpi/img_github.png differ diff --git a/again/app/src/main/res/drawable/button_round.xml b/again/app/src/main/res/drawable/button_round.xml new file mode 100644 index 0000000..09b0df6 --- /dev/null +++ b/again/app/src/main/res/drawable/button_round.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/AndroidAssignment/app/src/main/res/drawable/ic_launcher_background.xml b/again/app/src/main/res/drawable/ic_launcher_background.xml similarity index 100% rename from AndroidAssignment/app/src/main/res/drawable/ic_launcher_background.xml rename to again/app/src/main/res/drawable/ic_launcher_background.xml diff --git a/again/app/src/main/res/drawable/rectangle_border_pink.xml b/again/app/src/main/res/drawable/rectangle_border_pink.xml new file mode 100644 index 0000000..437938d --- /dev/null +++ b/again/app/src/main/res/drawable/rectangle_border_pink.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/again/app/src/main/res/drawable/rectangle_fill_gray.xml b/again/app/src/main/res/drawable/rectangle_fill_gray.xml new file mode 100644 index 0000000..f6d857b --- /dev/null +++ b/again/app/src/main/res/drawable/rectangle_fill_gray.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/again/app/src/main/res/drawable/selector_sample_text.xml b/again/app/src/main/res/drawable/selector_sample_text.xml new file mode 100644 index 0000000..9f95281 --- /dev/null +++ b/again/app/src/main/res/drawable/selector_sample_text.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/again/app/src/main/res/font/noto_sans_kr.xml b/again/app/src/main/res/font/noto_sans_kr.xml new file mode 100644 index 0000000..656d3f2 --- /dev/null +++ b/again/app/src/main/res/font/noto_sans_kr.xml @@ -0,0 +1,16 @@ + + + + + + + \ No newline at end of file diff --git a/again/app/src/main/res/font/noto_sans_kr_bold.otf b/again/app/src/main/res/font/noto_sans_kr_bold.otf new file mode 100644 index 0000000..7f4131c Binary files /dev/null and b/again/app/src/main/res/font/noto_sans_kr_bold.otf differ diff --git a/again/app/src/main/res/font/noto_sans_kr_regular.otf b/again/app/src/main/res/font/noto_sans_kr_regular.otf new file mode 100644 index 0000000..e26c1cd Binary files /dev/null and b/again/app/src/main/res/font/noto_sans_kr_regular.otf differ diff --git a/again/app/src/main/res/layout/activity_home.xml b/again/app/src/main/res/layout/activity_home.xml new file mode 100644 index 0000000..08b57b0 --- /dev/null +++ b/again/app/src/main/res/layout/activity_home.xml @@ -0,0 +1,26 @@ + + + +