diff --git a/AndroidAssignment/.idea/misc.xml b/AndroidAssignment/.idea/misc.xml deleted file mode 100644 index 831c5f5..0000000 --- a/AndroidAssignment/.idea/misc.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file 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/again/.idea/misc.xml b/again/.idea/misc.xml new file mode 100644 index 0000000..d68b23b --- /dev/null +++ b/again/.idea/misc.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + \ No newline at end of file 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/7\354\243\274\354\260\2501.PNG" "b/again/7\354\243\274\354\260\2501.PNG" new file mode 100644 index 0000000..eeb6641 Binary files /dev/null and "b/again/7\354\243\274\354\260\2501.PNG" differ diff --git "a/again/7\354\243\274\354\260\250\352\263\274\354\240\2341.gif" "b/again/7\354\243\274\354\260\250\352\263\274\354\240\2341.gif" new file mode 100644 index 0000000..6b04dd1 Binary files /dev/null and "b/again/7\354\243\274\354\260\250\352\263\274\354\240\2341.gif" differ diff --git "a/again/7\354\243\274\354\260\250\352\263\274\354\240\2342.gif" "b/again/7\354\243\274\354\260\250\352\263\274\354\240\2342.gif" new file mode 100644 index 0000000..ec6c063 Binary files /dev/null and "b/again/7\354\243\274\354\260\250\352\263\274\354\240\2342.gif" differ diff --git a/again/README.md b/again/README.md new file mode 100644 index 0000000..751e76a --- /dev/null +++ b/again/README.md @@ -0,0 +1,84 @@ +# 7주차 과제 + +### 1. 온보딩 화면 만들기 +fragment 세 개를 만들고 fragment를 담을 activity와 res폴더에 navigation파일을 만듭니다. + +navigation파일에서 fragment 세 개와 온보딩 이후 접속될 mainActivity를 추가하고 드래그앤드롭으로 연결합니다. + +그리고 각 프레그먼트에서 버튼의 setOnClickListener에서 findNavController를 이용해서 action을 지정해줍니다. +``` +binding.tvNextbutton.setOnClickListener{ + findNavController().navigate(R.id.action_onboardingFragment3_to_mainActivity) + (activity as StartActivity).finish() +} +``` +그리고 위처럼 finish를 이용해서 액티비티를 종료시켜줍니다. + + + +### 2. SharedPreferences 활용해서 자동로그인/자동로그인 해제 구현하기 + +``` +package org.sopt.study.againassignment.server + +import android.content.Context +import android.content.SharedPreferences + +object SOPTSharedPreferences { + private const val USER_AUTH = "USER_AUTH" + private const val AUTO_LOGIN = "AUTO_LOGIN" + + lateinit var preferences: SharedPreferences + + fun getAutoLogin(context: Context) : Boolean{ + preferences = setpref(context) + return preferences.getBoolean(AUTO_LOGIN, false) + } + + fun setAutoLogin(context: Context, auto:Boolean) { + preferences = setpref(context) + + preferences.edit() + .putBoolean(AUTO_LOGIN, auto) + .apply() + } + + fun removeAutoLogin(context: Context){ + preferences = setpref(context) + preferences.edit() + .remove(AUTO_LOGIN) + .apply() + } + + fun clearStorage(context:Context){ + preferences = setpref(context) + preferences.edit() + .clear() + .apply() + } + + fun setpref(context: Context):SharedPreferences{ + val preferences = context.getSharedPreferences(USER_AUTH, Context.MODE_PRIVATE) + return preferences + } +} +``` + +이렇게 preferences를 lateinit var을 통해서 선언하고 setpref를 통해 코드를 간소화했습니다. +``` +binding = ActivityLoginsettingBinding.inflate(layoutInflater) +binding2 = ActivityMainBinding.inflate(layoutInflater) + +binding.btAutoRemove.setOnClickListener{ + binding2.ivAutoLogin.isSelected=false + SOPTSharedPreferences.removeAutoLogin(this) + shortToast("자동로그인 해제되었습니다") + finish() +} +``` +그리고 환경설정 액티비티에서 위와 같이 자동로그인을 해제해줍니다. + +### 본인이 사용하는 Util 클래스 코드 및 패키징 방식 리드미에 정리하기 + + +위와 같이 저는 data파일들은 data패키지에 / 서버통신 관련 파일들은 server패키지에 / 액티비티, 프레그먼트, 어댑터는 ui 패키지에 / 나머지는 etc 패키지에 분류했습니다. \ 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..ee0623b --- /dev/null +++ b/again/app/build.gradle @@ -0,0 +1,64 @@ +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" + //7주차 세미나 navigation component + implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5' + implementation 'androidx.navigation:navigation-ui-ktx:2.3.5' + + //Glide + implementation 'com.github.bumptech.glide:glide:4.12.0' + annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0' + + 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..80af2e9 --- /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/data/RequestLoginData.kt b/again/app/src/main/java/org/sopt/study/againassignment/data/RequestLoginData.kt new file mode 100644 index 0000000..fcf926f --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/data/RequestLoginData.kt @@ -0,0 +1,9 @@ +package org.sopt.study.againassignment.data + +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/data/RequestSignupData.kt b/again/app/src/main/java/org/sopt/study/againassignment/data/RequestSignupData.kt new file mode 100644 index 0000000..c5c286a --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/data/RequestSignupData.kt @@ -0,0 +1,10 @@ +package org.sopt.study.againassignment.data + +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/data/ResponseLoginData.kt b/again/app/src/main/java/org/sopt/study/againassignment/data/ResponseLoginData.kt new file mode 100644 index 0000000..324003c --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/data/ResponseLoginData.kt @@ -0,0 +1,14 @@ +package org.sopt.study.againassignment.data + +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/data/ResponseSignupData.kt b/again/app/src/main/java/org/sopt/study/againassignment/data/ResponseSignupData.kt new file mode 100644 index 0000000..5d2ff48 --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/data/ResponseSignupData.kt @@ -0,0 +1,14 @@ +package org.sopt.study.againassignment.data + +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/data/UserData.kt b/again/app/src/main/java/org/sopt/study/againassignment/data/UserData.kt new file mode 100644 index 0000000..65a426f --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/data/UserData.kt @@ -0,0 +1,6 @@ +package org.sopt.study.againassignment.data + +data class UserData( + val name : String, + val introduction : String +) diff --git a/again/app/src/main/java/org/sopt/study/againassignment/etc/ViewExt.kt b/again/app/src/main/java/org/sopt/study/againassignment/etc/ViewExt.kt new file mode 100644 index 0000000..5d3cbbc --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/etc/ViewExt.kt @@ -0,0 +1,8 @@ +package org.sopt.study.againassignment + +import android.content.Context +import android.widget.Toast + +fun Context.shortToast(message:String){ + Toast.makeText(this, message, Toast.LENGTH_SHORT).show() +} \ No newline at end of file diff --git a/again/app/src/main/java/org/sopt/study/againassignment/server/SOPTSharedPreferences.kt b/again/app/src/main/java/org/sopt/study/againassignment/server/SOPTSharedPreferences.kt new file mode 100644 index 0000000..60c03f1 --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/server/SOPTSharedPreferences.kt @@ -0,0 +1,43 @@ +package org.sopt.study.againassignment.server + +import android.content.Context +import android.content.SharedPreferences + +object SOPTSharedPreferences { + private const val USER_AUTH = "USER_AUTH" + private const val AUTO_LOGIN = "AUTO_LOGIN" + + lateinit var preferences: SharedPreferences + + fun getAutoLogin(context: Context) : Boolean{ + preferences = setpref(context) + return preferences.getBoolean(AUTO_LOGIN, false) + } + + fun setAutoLogin(context: Context, auto:Boolean) { + preferences = setpref(context) + + preferences.edit() + .putBoolean(AUTO_LOGIN, auto) + .apply() + } + + fun removeAutoLogin(context: Context){ + preferences = setpref(context) + preferences.edit() + .remove(AUTO_LOGIN) + .apply() + } + + fun clearStorage(context:Context){ + preferences = setpref(context) + preferences.edit() + .clear() + .apply() + } + + fun setpref(context: Context):SharedPreferences{ + val preferences = context.getSharedPreferences(USER_AUTH, Context.MODE_PRIVATE) + return preferences + } +} \ No newline at end of file diff --git a/again/app/src/main/java/org/sopt/study/againassignment/server/SampleService.kt b/again/app/src/main/java/org/sopt/study/againassignment/server/SampleService.kt new file mode 100644 index 0000000..bfc101a --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/server/SampleService.kt @@ -0,0 +1,16 @@ +package org.sopt.study.againassignment.server + +import org.sopt.study.againassignment.data.RequestLoginData +import org.sopt.study.againassignment.data.ResponseLoginData +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/server/ServiceCreator.kt b/again/app/src/main/java/org/sopt/study/againassignment/server/ServiceCreator.kt new file mode 100644 index 0000000..d18dff8 --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/server/ServiceCreator.kt @@ -0,0 +1,16 @@ +package org.sopt.study.againassignment.server + +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/server/SignUp.kt b/again/app/src/main/java/org/sopt/study/againassignment/server/SignUp.kt new file mode 100644 index 0000000..6856bc0 --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/server/SignUp.kt @@ -0,0 +1,16 @@ +package org.sopt.study.againassignment.server + +import org.sopt.study.againassignment.data.RequestSignupData +import org.sopt.study.againassignment.data.ResponseSignupData +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/ui/FollowerAdapter.kt b/again/app/src/main/java/org/sopt/study/againassignment/ui/FollowerAdapter.kt new file mode 100644 index 0000000..cbd3520 --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/ui/FollowerAdapter.kt @@ -0,0 +1,37 @@ +package org.sopt.study.againassignment.ui + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import org.sopt.study.againassignment.data.UserData +import org.sopt.study.againassignment.databinding.ItemSampleListBinding + +class FollowerAdapter : RecyclerView.Adapter() { + val userList = mutableListOf() + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): FollowerViewHolder { + val binding = ItemSampleListBinding.inflate( + LayoutInflater.from(parent.context), + parent, false + ) + + return FollowerViewHolder(binding) + } + + override fun onBindViewHolder(holder: 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/ui/HomeActivity.kt b/again/app/src/main/java/org/sopt/study/againassignment/ui/HomeActivity.kt new file mode 100644 index 0000000..5222842 --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/ui/HomeActivity.kt @@ -0,0 +1,25 @@ +package org.sopt.study.againassignment.ui + +import android.content.Intent +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import org.sopt.study.againassignment.R +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) + + intent = Intent(this, LoginsettingActivity::class.java) + binding.btLoginsetting.setOnClickListener{ + startActivity(intent) + } + + setContentView(binding.root) + } +} \ No newline at end of file diff --git a/again/app/src/main/java/org/sopt/study/againassignment/ui/LoginsettingActivity.kt b/again/app/src/main/java/org/sopt/study/againassignment/ui/LoginsettingActivity.kt new file mode 100644 index 0000000..005bb7f --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/ui/LoginsettingActivity.kt @@ -0,0 +1,27 @@ +package org.sopt.study.againassignment.ui + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import org.sopt.study.againassignment.server.SOPTSharedPreferences +import org.sopt.study.againassignment.databinding.ActivityLoginsettingBinding +import org.sopt.study.againassignment.databinding.ActivityMainBinding +import org.sopt.study.againassignment.shortToast + +class LoginsettingActivity : AppCompatActivity() { + lateinit var binding : ActivityLoginsettingBinding + lateinit var binding2 : ActivityMainBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivityLoginsettingBinding.inflate(layoutInflater) + binding2 = ActivityMainBinding.inflate(layoutInflater) + + binding.btAutoRemove.setOnClickListener{ + binding2.ivAutoLogin.isSelected=false + SOPTSharedPreferences.removeAutoLogin(this) + shortToast("자동로그인 해제되었습니다") + finish() + } + setContentView(binding.root) + } +} \ No newline at end of file diff --git a/again/app/src/main/java/org/sopt/study/againassignment/ui/MainActivity.kt b/again/app/src/main/java/org/sopt/study/againassignment/ui/MainActivity.kt new file mode 100644 index 0000000..bfad208 --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/ui/MainActivity.kt @@ -0,0 +1,78 @@ +package org.sopt.study.againassignment.ui + +import android.content.Intent +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.util.Log +import org.sopt.study.againassignment.* +import org.sopt.study.againassignment.data.RequestLoginData +import org.sopt.study.againassignment.data.ResponseLoginData +import org.sopt.study.againassignment.databinding.ActivityMainBinding +import org.sopt.study.againassignment.server.SOPTSharedPreferences +import org.sopt.study.againassignment.server.ServiceCreator +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() + } + + initClickEvent() + isAutoLogin() + + setContentView(binding.root) + } + + private fun initClickEvent(){ + binding.ivAutoLogin.setOnClickListener{ + binding.ivAutoLogin.isSelected = !binding.ivAutoLogin.isSelected + + SOPTSharedPreferences.setAutoLogin(this, binding.ivAutoLogin.isSelected) + } + } + + private fun isAutoLogin(){ + if(SOPTSharedPreferences.getAutoLogin(this)){ + shortToast("자동로그인 되었습니다.") + startActivity(Intent(this, HomeActivity::class.java)) + } + } + + 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 + ) { + shortToast("서버통신 성공") + startActivity(Intent(this@MainActivity, HomeActivity::class.java)) + } + + 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/ui/OnboardingFragment1.kt b/again/app/src/main/java/org/sopt/study/againassignment/ui/OnboardingFragment1.kt new file mode 100644 index 0000000..01770ff --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/ui/OnboardingFragment1.kt @@ -0,0 +1,26 @@ +package org.sopt.study.againassignment.ui + +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.R +import org.sopt.study.againassignment.databinding.FragmentOnboarding1Binding + +class OnboardingFragment1 : Fragment() { + private var _binding : FragmentOnboarding1Binding?=null + private val binding get() = _binding!! + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + _binding = FragmentOnboarding1Binding.inflate(inflater, container, false) + binding.tvNextbutton.setOnClickListener{ + findNavController().navigate(R.id.action_onboardingFragment1_to_onboardingFragment2) + } + return binding.root + } +} \ No newline at end of file diff --git a/again/app/src/main/java/org/sopt/study/againassignment/ui/OnboardingFragment2.kt b/again/app/src/main/java/org/sopt/study/againassignment/ui/OnboardingFragment2.kt new file mode 100644 index 0000000..ad40474 --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/ui/OnboardingFragment2.kt @@ -0,0 +1,26 @@ +package org.sopt.study.againassignment.ui + +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.R +import org.sopt.study.againassignment.databinding.FragmentOnboarding2Binding + +class OnboardingFragment2 : Fragment() { + private var _binding:FragmentOnboarding2Binding?=null + private val binding get() = _binding!! + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + _binding = FragmentOnboarding2Binding.inflate(inflater, container, false) + binding.tvNextbutton.setOnClickListener{ + findNavController().navigate(R.id.action_onboardingFragment2_to_onboardingFragment3) + } + return binding.root + } +} \ No newline at end of file diff --git a/again/app/src/main/java/org/sopt/study/againassignment/ui/OnboardingFragment3.kt b/again/app/src/main/java/org/sopt/study/againassignment/ui/OnboardingFragment3.kt new file mode 100644 index 0000000..57c47a4 --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/ui/OnboardingFragment3.kt @@ -0,0 +1,31 @@ +package org.sopt.study.againassignment.ui + +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 com.bumptech.glide.Glide +import org.sopt.study.againassignment.R +import org.sopt.study.againassignment.databinding.FragmentOnboarding3Binding + +class OnboardingFragment3 : Fragment() { + + private var _binding:FragmentOnboarding3Binding?=null + private val binding get() = _binding!! + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + // Inflate the layout for this fragment + _binding= FragmentOnboarding3Binding.inflate(inflater, container, false) + Glide.with(binding.ivOnboardprofile).load(R.drawable.myface).circleCrop().into(binding.ivOnboardprofile) + binding.tvNextbutton.setOnClickListener{ + findNavController().navigate(R.id.action_onboardingFragment3_to_mainActivity) + (activity as StartActivity).finish() + } + return binding.root + } +} \ No newline at end of file diff --git a/again/app/src/main/java/org/sopt/study/againassignment/ui/SignUpActivity.kt b/again/app/src/main/java/org/sopt/study/againassignment/ui/SignUpActivity.kt new file mode 100644 index 0000000..d50de1f --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/ui/SignUpActivity.kt @@ -0,0 +1,55 @@ +package org.sopt.study.againassignment.ui + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.util.Log +import android.widget.Toast +import org.sopt.study.againassignment.data.RequestSignupData +import org.sopt.study.againassignment.data.ResponseSignupData +import org.sopt.study.againassignment.server.ServiceCreator +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/ui/StartActivity.kt b/again/app/src/main/java/org/sopt/study/againassignment/ui/StartActivity.kt new file mode 100644 index 0000000..0ca7ad4 --- /dev/null +++ b/again/app/src/main/java/org/sopt/study/againassignment/ui/StartActivity.kt @@ -0,0 +1,12 @@ +package org.sopt.study.againassignment.ui + +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import org.sopt.study.againassignment.R + +class StartActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_start) + } +} \ No newline at end of file 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/ic_checkbox_off.xml b/again/app/src/main/res/drawable-xhdpi/ic_checkbox_off.xml new file mode 100644 index 0000000..333fac0 --- /dev/null +++ b/again/app/src/main/res/drawable-xhdpi/ic_checkbox_off.xml @@ -0,0 +1,15 @@ + + + + diff --git a/again/app/src/main/res/drawable-xhdpi/ic_checkbox_on.xml b/again/app/src/main/res/drawable-xhdpi/ic_checkbox_on.xml new file mode 100644 index 0000000..41d075d --- /dev/null +++ b/again/app/src/main/res/drawable-xhdpi/ic_checkbox_on.xml @@ -0,0 +1,15 @@ + + + + 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_checkbox.xml b/again/app/src/main/res/drawable/selector_checkbox.xml new file mode 100644 index 0000000..9d131f5 --- /dev/null +++ b/again/app/src/main/res/drawable/selector_checkbox.xml @@ -0,0 +1,5 @@ + + + + + \ 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..1382531 --- /dev/null +++ b/again/app/src/main/res/layout/activity_home.xml @@ -0,0 +1,30 @@ + + + + + + +