diff --git a/app/build.gradle b/app/build.gradle index f989348b..36c7a443 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -58,6 +58,7 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.5.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' + implementation 'com.google.firebase:firebase-firestore-ktx:24.10.2' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6cc7580a..0a19083a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -7,6 +7,9 @@ + + + > + + @Multipart + @POST("/api/v1/privacy/insert") + suspend fun savePrivacy( + @Part profileImage: MultipartBody.Part, + @Part categories:List, + @PartMap params:MutableMap + ) + :Response> } \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/data/model/signup/SignupRequest.kt b/app/src/main/java/com/umc/ttoklip/data/model/signup/SignupRequest.kt new file mode 100644 index 00000000..9ef9921f --- /dev/null +++ b/app/src/main/java/com/umc/ttoklip/data/model/signup/SignupRequest.kt @@ -0,0 +1,10 @@ +package com.umc.ttoklip.data.model.signup + +data class SignupRequest( + val street:String, + val nickname:String, + val category:ArrayList, + val profileImage:String, + val independentYear:Int, + val independentMonth:Int +) diff --git a/app/src/main/java/com/umc/ttoklip/data/model/signup/SignupResponse.kt b/app/src/main/java/com/umc/ttoklip/data/model/signup/SignupResponse.kt index 36d7e7b9..eecbcad9 100644 --- a/app/src/main/java/com/umc/ttoklip/data/model/signup/SignupResponse.kt +++ b/app/src/main/java/com/umc/ttoklip/data/model/signup/SignupResponse.kt @@ -2,4 +2,4 @@ package com.umc.ttoklip.data.model.signup data class SignupResponse( val message:String -) \ No newline at end of file +) diff --git a/app/src/main/java/com/umc/ttoklip/data/repository/signup/SignupRepository.kt b/app/src/main/java/com/umc/ttoklip/data/repository/signup/SignupRepository.kt index 1b8ebc0a..24502b07 100644 --- a/app/src/main/java/com/umc/ttoklip/data/repository/signup/SignupRepository.kt +++ b/app/src/main/java/com/umc/ttoklip/data/repository/signup/SignupRepository.kt @@ -1,10 +1,15 @@ package com.umc.ttoklip.data.repository.signup -import com.umc.ttoklip.data.model.login.LoginRequest -import com.umc.ttoklip.data.model.login.LoginResponse +import com.umc.ttoklip.data.model.signup.SignupRequest import com.umc.ttoklip.data.model.signup.SignupResponse import com.umc.ttoklip.module.NetworkResult +import okhttp3.MultipartBody +import okhttp3.RequestBody interface SignupRepository { suspend fun checkNickname(nick:String): NetworkResult + suspend fun savePrivacy(photo: MultipartBody.Part, + info:MutableMap + ,cate:List) + : NetworkResult } \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/data/repository/signup/SignupRepositoryImpl.kt b/app/src/main/java/com/umc/ttoklip/data/repository/signup/SignupRepositoryImpl.kt index 0cd5e654..c140793a 100644 --- a/app/src/main/java/com/umc/ttoklip/data/repository/signup/SignupRepositoryImpl.kt +++ b/app/src/main/java/com/umc/ttoklip/data/repository/signup/SignupRepositoryImpl.kt @@ -2,15 +2,23 @@ package com.umc.ttoklip.data.repository.signup import com.umc.ttoklip.data.api.SignupApi import com.umc.ttoklip.data.model.ResponseBody +import com.umc.ttoklip.data.model.signup.SignupRequest import com.umc.ttoklip.data.model.signup.SignupResponse import com.umc.ttoklip.module.NetworkResult import com.umc.ttoklip.module.handleApi +import okhttp3.MultipartBody +import okhttp3.RequestBody +import retrofit2.http.Part import javax.inject.Inject class SignupRepositoryImpl @Inject constructor( private val api: SignupApi ): SignupRepository { override suspend fun checkNickname(nick: String): NetworkResult { - return handleApi({api.nickCheck(nick)}){response: ResponseBody ->response.result} + return handleApi({api.nickCheck(nick)}) {response: ResponseBody ->response.result} + } + + override suspend fun savePrivacy(photo:MultipartBody.Part,info:MutableMap,cate:List): NetworkResult { + return handleApi({api.savePrivacy(photo,cate,info)}) {response: ResponseBody ->response.result} } } \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/presentation/intro/SplashActivity.kt b/app/src/main/java/com/umc/ttoklip/presentation/intro/SplashActivity.kt index 48ed999f..8805e36f 100644 --- a/app/src/main/java/com/umc/ttoklip/presentation/intro/SplashActivity.kt +++ b/app/src/main/java/com/umc/ttoklip/presentation/intro/SplashActivity.kt @@ -4,6 +4,7 @@ import android.content.Intent import android.os.Handler import android.os.Looper import com.umc.ttoklip.R +import com.umc.ttoklip.TtoklipApplication import com.umc.ttoklip.databinding.ActivitySplashBinding import com.umc.ttoklip.presentation.MainActivity import com.umc.ttoklip.presentation.base.BaseActivity @@ -15,10 +16,15 @@ class SplashActivity:BaseActivity(R.layout.activity_splas handler.postDelayed({ val spf=getSharedPreferences("first", MODE_PRIVATE) val firstRun=spf.getBoolean("firstRun",true) + val jwt=TtoklipApplication.prefs.getString("jwt","") + val isFirstLogin=TtoklipApplication.prefs.getBoolean("isFirstLogin",true) if(firstRun){ startActivity(Intent(this, IntroActivity::class.java)) finish() - }else{ + }else if(jwt.isNotEmpty()&&!isFirstLogin){ + startActivity(Intent(this,MainActivity::class.java)) + finish() + } else{ startActivity(Intent(this, LoginActivity::class.java)) finish() } diff --git a/app/src/main/java/com/umc/ttoklip/presentation/login/LoginActivity.kt b/app/src/main/java/com/umc/ttoklip/presentation/login/LoginActivity.kt index e84099a9..56efe850 100644 --- a/app/src/main/java/com/umc/ttoklip/presentation/login/LoginActivity.kt +++ b/app/src/main/java/com/umc/ttoklip/presentation/login/LoginActivity.kt @@ -32,6 +32,8 @@ class LoginActivity : BaseActivity(R.layout.activity_login private val viewModel: LoginViewModel by viewModels() override fun initView() { + loginActivity=this + viewModel.initIsLogin() binding.loginNaverBtn.setOnClickListener { val oauthLoginCallback = object : OAuthLoginCallback { @@ -80,6 +82,8 @@ class LoginActivity : BaseActivity(R.layout.activity_login } else if (token != null) { Log.i("카카오로그인", "카카오톡으로 로그인 성공") val loginRequest = LoginRequest("${token.accessToken}", "kakao") + //임시 토큰확인용 +// Log.i("KAKAO-LOGIN","${token.accessToken}") viewModel.postLogin(loginRequest) } } @@ -89,10 +93,15 @@ class LoginActivity : BaseActivity(R.layout.activity_login } } + companion object{ + var loginActivity:LoginActivity?=null + } + private fun startactivity() { - //회원가입 만들기용 임시 +// 회원가입 만들기용 임시 // val intent = Intent(this, SignupActivity::class.java) // startActivity(intent) +// Log.i("JWT",TtoklipApplication.prefs.getString("jwt","")) //이쪽이 진짜 if (viewModel.isFirstLogin.value) { @@ -100,8 +109,8 @@ class LoginActivity : BaseActivity(R.layout.activity_login startActivity(intent) } else { startActivity(Intent(this, MainActivity::class.java)) + finish() } - finish() } override fun onBackPressed() { diff --git a/app/src/main/java/com/umc/ttoklip/presentation/login/LoginViewModel.kt b/app/src/main/java/com/umc/ttoklip/presentation/login/LoginViewModel.kt index f54924db..e675e28a 100644 --- a/app/src/main/java/com/umc/ttoklip/presentation/login/LoginViewModel.kt +++ b/app/src/main/java/com/umc/ttoklip/presentation/login/LoginViewModel.kt @@ -33,6 +33,7 @@ class LoginViewModel @Inject constructor( loginRepository.postLogin(request) .onSuccess { TtoklipApplication.prefs.setString("jwt",it.jwtToken) + TtoklipApplication.prefs.setBoolean("isFirstLogin",it.ifFirstLogin) _isFirstLogin.value=it.ifFirstLogin _isLogin.value=true }.onFail { diff --git a/app/src/main/java/com/umc/ttoklip/presentation/signup/LocationActivity.kt b/app/src/main/java/com/umc/ttoklip/presentation/signup/LocationActivity.kt index d431ce00..27235860 100644 --- a/app/src/main/java/com/umc/ttoklip/presentation/signup/LocationActivity.kt +++ b/app/src/main/java/com/umc/ttoklip/presentation/signup/LocationActivity.kt @@ -7,8 +7,10 @@ import android.location.Address import android.location.Geocoder import android.os.Build import android.widget.SeekBar +import androidx.activity.viewModels import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat +import androidx.fragment.app.viewModels import com.naver.maps.geometry.LatLng import com.naver.maps.map.LocationTrackingMode import com.naver.maps.map.MapFragment @@ -23,12 +25,16 @@ import com.umc.ttoklip.databinding.ActivityLocationBinding import com.umc.ttoklip.presentation.MainActivity import com.umc.ttoklip.presentation.base.BaseActivity import com.umc.ttoklip.presentation.login.LoginActivity +import dagger.hilt.android.AndroidEntryPoint import java.util.Locale +@AndroidEntryPoint class LocationActivity : BaseActivity(R.layout.activity_location), OnMapReadyCallback { + private val viewModel: SignupViewModel by viewModels() + private lateinit var naverMap: NaverMap private lateinit var locationSource: FusedLocationSource private lateinit var uiSetting: UiSettings @@ -39,9 +45,9 @@ class LocationActivity : Manifest.permission.ACCESS_COARSE_LOCATION ) private lateinit var range: String - private lateinit var circle:CircleOverlay + private lateinit var circle: CircleOverlay - private var locationok:Boolean=false + private var locationok: Boolean = false override fun initView() { @@ -49,7 +55,7 @@ class LocationActivity : ActivityCompat.requestPermissions(this, PERMISSIONS, LOCATION_PERMISSION_REQUEST_CODE) } initMapView() - circle= CircleOverlay() + circle = CircleOverlay() range = getString(R.string.range_500m) binding.locationRangeDescTv.text = @@ -69,7 +75,7 @@ class LocationActivity : } else { setRange15km() } - if(locationok) setcircle() + if (locationok) setcircle() } override fun onStartTrackingTouch(seekBar: SeekBar?) = Unit @@ -86,13 +92,28 @@ class LocationActivity : setRange15km() } } - if(locationok) setcircle() + if (locationok) setcircle() } }) binding.locationNextBtn.setOnClickListener { - if (locationok){ - startActivity(Intent(this,MainActivity::class.java)) + if (locationok) { + val bundle = intent.getBundleExtra("userInfo") + if (bundle != null) { + viewModel.saveUserStreet(address) + viewModel.saveUserInfoAt4( + bundle.getString("nickname")!!, + bundle.getStringArrayList("interest")!!, + bundle.getString("imageUri")!!, + bundle.getInt("independentCareerYear")!!, + bundle.getInt("independentCareerMonth")!!) + } + viewModel.savePrivacy() + startActivity(Intent(this, MainActivity::class.java)) + val loginActivity=LoginActivity.loginActivity + loginActivity?.finish() + val signupActivity=SignupActivity.signupActivity + signupActivity?.finish() finish() } } @@ -115,19 +136,19 @@ class LocationActivity : it.latitude, it.longitude ) - circle.center= LatLng(it.latitude,it.longitude) - locationok=true + circle.center = LatLng(it.latitude, it.longitude) + locationok = true setcircle() nextok() } } - private fun setcircle(){ - if(range=="500m")circle.radius=500.0 - else if(range=="1km")circle.radius=1000.0 - else circle.radius=1500.0 - circle.color=ContextCompat.getColor(this, R.color.yellow_trans30) - circle.map=naverMap + private fun setcircle() { + if (range == "500m") circle.radius = 500.0 + else if (range == "1km") circle.radius = 1000.0 + else circle.radius = 1500.0 + circle.color = ContextCompat.getColor(this, R.color.yellow_trans30) + circle.map = naverMap } private fun hasPermission(): Boolean { @@ -141,13 +162,13 @@ class LocationActivity : return true } - private fun nextok(){ - if(locationok){ - binding.locationNextBtn.isClickable=true + private fun nextok() { + if (locationok) { + binding.locationNextBtn.isClickable = true binding.locationNextBtn.setBackgroundResource(R.drawable.rectangle_corner_10_yellow) binding.locationNextBtn.setTextAppearance(R.style.TextAppearance_App_16sp_700) - }else{ - binding.locationNextBtn.isClickable=false + } else { + binding.locationNextBtn.isClickable = false binding.locationNextBtn.setBackgroundResource(R.drawable.rectangle_corner_10_strok_1_black) binding.locationNextBtn.setTextAppearance(R.style.TextAppearance_App_16sp_500) } diff --git a/app/src/main/java/com/umc/ttoklip/presentation/signup/SignupActivity.kt b/app/src/main/java/com/umc/ttoklip/presentation/signup/SignupActivity.kt index 883999f4..28b1b534 100644 --- a/app/src/main/java/com/umc/ttoklip/presentation/signup/SignupActivity.kt +++ b/app/src/main/java/com/umc/ttoklip/presentation/signup/SignupActivity.kt @@ -1,21 +1,19 @@ package com.umc.ttoklip.presentation.signup import android.view.View -import androidx.fragment.app.Fragment -import androidx.navigation.NavController -import androidx.navigation.Navigation import androidx.navigation.fragment.NavHostFragment import androidx.navigation.fragment.findNavController import com.umc.ttoklip.R import com.umc.ttoklip.databinding.ActivitySignupBinding import com.umc.ttoklip.presentation.base.BaseActivity -import com.umc.ttoklip.presentation.mypage.InputIndependentCareerDialogFragment -import dagger.hilt.EntryPoint +import com.umc.ttoklip.presentation.login.LoginActivity import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint class SignupActivity:BaseActivity(R.layout.activity_signup) { override fun initView() { + signupActivity=this + val navHostFragment = supportFragmentManager.findFragmentById(R.id.signup_frm)as NavHostFragment var navController=navHostFragment.findNavController() binding.signupBackIb.setOnClickListener { @@ -49,4 +47,8 @@ class SignupActivity:BaseActivity(R.layout.activity_signu binding.signupBackIb.visibility= View.INVISIBLE binding.signupCancelIb.visibility= View.VISIBLE } + + companion object{ + var signupActivity: SignupActivity?=null + } } diff --git a/app/src/main/java/com/umc/ttoklip/presentation/signup/SignupViewModel.kt b/app/src/main/java/com/umc/ttoklip/presentation/signup/SignupViewModel.kt index 74031beb..80e68394 100644 --- a/app/src/main/java/com/umc/ttoklip/presentation/signup/SignupViewModel.kt +++ b/app/src/main/java/com/umc/ttoklip/presentation/signup/SignupViewModel.kt @@ -1,68 +1,139 @@ package com.umc.ttoklip.presentation.signup +import android.net.Uri import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.umc.ttoklip.TtoklipApplication -import com.umc.ttoklip.data.model.login.LoginRequest +import com.umc.ttoklip.data.model.signup.SignupRequest import com.umc.ttoklip.data.repository.signup.SignupRepositoryImpl +import com.umc.ttoklip.module.onError import com.umc.ttoklip.module.onFail import com.umc.ttoklip.module.onSuccess import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.launch +import okhttp3.MediaType +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.MultipartBody +import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.asRequestBody +import okhttp3.RequestBody.Companion.toRequestBody +import okhttp3.ResponseBody +import java.io.File import javax.inject.Inject +import javax.inject.Singleton @HiltViewModel class SignupViewModel @Inject constructor( private val signupRepository: SignupRepositoryImpl ) : ViewModel() { + private val _nickcheckbtn=MutableStateFlow(false) + val nickcheckbtn:StateFlow + get() = _nickcheckbtn private val _nickok = MutableStateFlow(false) val nickok: StateFlow get() = _nickok + private var _independentCareerok = MutableStateFlow(false) + val independentCareerok: StateFlow + get() = _independentCareerok + private var _interestok = MutableStateFlow(false) + val interestok: StateFlow + get() = _interestok + fun nickCheck(nick: String) { viewModelScope.launch { signupRepository.checkNickname(nick) .onSuccess { Log.i("nick check", "성공") - _nickok.value=true + _nickok.value = true }.onFail { Log.d("nick check", "실패") - _nickok.value=false + _nickok.value = false } } } + fun nickcheckclick(){ + viewModelScope.launch { + _nickcheckbtn.value=true + } + } + + fun independentCheck(indendentok: Boolean) { + viewModelScope.launch { + _independentCareerok.value = indendentok + } + } - private val _nickname = MutableStateFlow("") + fun interestCheck(interestok: Boolean) { + viewModelScope.launch { + _interestok.value = interestok + } + } + + private var _nickname = MutableStateFlow("") val nickname: StateFlow get() = _nickname - private val _categories = MutableStateFlow>(ArrayList()) + private var _categories = MutableStateFlow>(ArrayList()) val categories: StateFlow> get() = _categories - private val _profileImage=MutableStateFlow("") - val profileImage:StateFlow + private var _profileImage = MutableStateFlow("") + val profileImage: StateFlow get() = _profileImage - private val _independenctYear=MutableStateFlow(0) - val independentYear:StateFlow + private var _independenctYear = MutableStateFlow(0) + val independenctYear: StateFlow get() = _independenctYear - private val _independenctMonth=MutableStateFlow(0) - val independentMonth:StateFlow + private var _independenctMonth = MutableStateFlow(0) + val independenctMonth: StateFlow get() = _independenctMonth - fun saveUserInfo( - nick: String, - categories: ArrayList, - profileImage: String, - independentYear: Int, - independentMonth: Int + fun saveUserInfoAt4( + unick: String, + ucategories: ArrayList, + uprofileImage: String, + uindependentYear: Int, + uindependentMonth: Int ) { - _nickname.value=nick - _categories.value=categories - _profileImage.value=profileImage - _independenctYear.value=independentYear - _independenctMonth.value=independentMonth - TtoklipApplication.prefs.setString("nickname",nick) + _nickname.value = unick + _categories.value = ucategories + _profileImage.value = uprofileImage + _independenctYear.value = uindependentYear + _independenctMonth.value = uindependentMonth + TtoklipApplication.prefs.setString("nickname", unick) + } + + private var street: String = "" + fun saveUserStreet(ustreet: String) { + street = ustreet + } + + fun savePrivacy() { + viewModelScope.launch { + val file = File(profileImage.value) + val requestBody = file.asRequestBody("image/jpeg".toMediaTypeOrNull()) + val fileToUpload = + MultipartBody.Part.createFormData("profileImage", file.name+".jpg", requestBody) + + val cate=ArrayList() + for (c in categories.value) { + cate.add(MultipartBody.Part.createFormData("categories",c)) + } + + val requestMap= hashMapOf() + requestMap["street"] = street.toRequestBody("text/plain".toMediaTypeOrNull()) + requestMap["nickname"] = nickname.value.toRequestBody("text/plain".toMediaTypeOrNull()) + requestMap["independentYear"] = independenctYear.value.toString().toRequestBody("text/plain".toMediaTypeOrNull()) + requestMap["independentMonth"] = independenctMonth.value.toString().toRequestBody("text/plain".toMediaTypeOrNull()) + signupRepository.savePrivacy(fileToUpload, requestMap,cate) + .onSuccess { + Log.i("USERSAVE", "성공") + }.onFail { + Log.d("USERSAVE", "실패") + }.onError { + Log.d("USERSAVE ERROR", it.toString()) + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/umc/ttoklip/presentation/signup/fragments/Signup4Fragment.kt b/app/src/main/java/com/umc/ttoklip/presentation/signup/fragments/Signup4Fragment.kt index 65a4e4dc..accce65f 100644 --- a/app/src/main/java/com/umc/ttoklip/presentation/signup/fragments/Signup4Fragment.kt +++ b/app/src/main/java/com/umc/ttoklip/presentation/signup/fragments/Signup4Fragment.kt @@ -1,59 +1,88 @@ package com.umc.ttoklip.presentation.signup.fragments +import android.content.Context +import android.database.Cursor +import android.net.Uri +import android.os.Bundle +import android.provider.MediaStore +import android.util.Log import android.view.View +import androidx.activity.result.PickVisualMediaRequest +import androidx.activity.result.contract.ActivityResultContracts import androidx.core.content.ContextCompat import androidx.fragment.app.viewModels +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle import androidx.navigation.fragment.findNavController +import com.bumptech.glide.Glide import com.google.android.material.chip.Chip import com.umc.ttoklip.R import com.umc.ttoklip.databinding.FragmentSignup4Binding import com.umc.ttoklip.presentation.base.BaseFragment +import com.umc.ttoklip.presentation.honeytip.dialog.ImageDialogFragment import com.umc.ttoklip.presentation.mypage.ChooseMainInterestDialogFragment import com.umc.ttoklip.presentation.mypage.InputIndependentCareerDialogFragment import com.umc.ttoklip.presentation.signup.SignupActivity import com.umc.ttoklip.presentation.signup.SignupViewModel import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch +import java.io.File @AndroidEntryPoint class Signup4Fragment : BaseFragment(R.layout.fragment_signup4) { private val viewModel: SignupViewModel by viewModels() - private lateinit var interestArray:ArrayList + private lateinit var interestArray: ArrayList - private var independentCareerYear:Int? =null - private var independentCareerMonth: Int? =null + private var independentCareerYear: Int? = null + private var independentCareerMonth: Int? = null - private var nickok:Boolean=false - private var independentCareerNotNull:Boolean=false - private var interestNotNull:Boolean=false + private var nickcheckbtn: Boolean = false override fun initObserver() { + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + launch { + viewModel.nickcheckbtn.collect{ + if(it){ + delay(100) + viewModel.nickok.collect { + if (it) { + binding.signup4NickokTv.visibility = View.VISIBLE + binding.signup4NicknotokTv.visibility = View.GONE + } else { + binding.signup4NickokTv.visibility = View.GONE + binding.signup4NicknotokTv.visibility = View.VISIBLE + } + nextok() + } + } + } + } + } + } } override fun initView() { - interestArray=ArrayList() + interestArray = ArrayList() val activity = activity as SignupActivity activity?.setProg(2) binding.signup4NickcheckButton.setOnClickListener { - //닉네임 확인 로직 viewModel.nickCheck(binding.signup4NicknameEt.text.toString()) - if(viewModel.nickok.value){ - binding.signup4NickokTv.visibility = View.VISIBLE - binding.signup4NicknotokTv.visibility = View.GONE - nickok=true - }else{ - binding.signup4NickokTv.visibility = View.GONE - binding.signup4NicknotokTv.visibility = View.VISIBLE - nickok=false - } - nextok() + viewModel.nickcheckclick() } - if(independentCareerYear!=null||independentCareerMonth!=null){ + if (independentCareerYear != null || independentCareerMonth != null) { if (independentCareerYear != ZERO_CAREER && independentCareerMonth != ZERO_CAREER) { binding.signup4IndependenceEt.text = - getString(R.string.my_independent_career_base_format, independentCareerYear, independentCareerMonth) + getString( + R.string.my_independent_career_base_format, + independentCareerYear, + independentCareerMonth + ) } else if (independentCareerYear != ZERO_CAREER) { binding.signup4IndependenceEt.text = getString(R.string.my_independent_career_year_format, independentCareerYear) @@ -64,11 +93,18 @@ class Signup4Fragment : BaseFragment(R.layout.fragment_s binding.signup4IndependenceEt.text = getString(R.string.my_independent_career_month_format, ZERO_CAREER) } - binding.signup4IndependenceEt.setTextColor(ContextCompat.getColor(activity,R.color.black)) + binding.signup4IndependenceEt.setTextColor( + ContextCompat.getColor( + activity, + R.color.black + ) + ) + viewModel.independentCheck(true) + nextok() } binding.signup4IndependenceEt.setOnClickListener { - independentCareerNotNull=true + viewModel.independentCheck(true) val bottomSheet = InputIndependentCareerDialogFragment { year, month -> if (year != ZERO_CAREER && month != ZERO_CAREER) { binding.signup4IndependenceEt.text = @@ -83,19 +119,24 @@ class Signup4Fragment : BaseFragment(R.layout.fragment_s binding.signup4IndependenceEt.text = getString(R.string.my_independent_career_month_format, ZERO_CAREER) } - independentCareerYear=year - independentCareerMonth=month + independentCareerYear = year + independentCareerMonth = month } bottomSheet.show(activity.supportFragmentManager, bottomSheet.tag) - binding.signup4IndependenceEt.setTextColor(ContextCompat.getColor(activity,R.color.black) + binding.signup4IndependenceEt.setTextColor( + ContextCompat.getColor( + activity, + R.color.black + ) ) - + viewModel.independentCheck(true) nextok() } binding.signup4InterestGroup.setOnClickListener { binding.signup4InterestDescTv.visibility = View.GONE binding.signup4InterestIconIv.visibility = View.GONE + viewModel.interestCheck(false) //chip 클릭해야 발생 val bottomSheet = ChooseMainInterestDialogFragment { interests -> binding.signup4InterestGroup.removeAllViews() @@ -109,36 +150,90 @@ class Signup4Fragment : BaseFragment(R.layout.fragment_s chip.setChipStrokeColorResource(R.color.yellow) binding.signup4InterestGroup.addView(chip) - interestArray.add(interest) + val interestType= + if (interest.equals("집안일"))"HOUSEWORK" + else if(interest.equals("요리"))"RECIPE" + else if(interest.equals("안전한 생활"))"SAFE_LIVING" + else if(interest.equals("사기"))"FRAUD" + else "WELFARE_POLICY" + interestArray.add(interestType) } - interestNotNull=true + if (interests.isNotEmpty()) viewModel.interestCheck(true) + nextok() } bottomSheet.show(activity.supportFragmentManager, bottomSheet.tag) + } - nextok() + binding.signup4CameraIv.setOnClickListener { + setProfileImage(activity) + } + binding.signup4ProfileImageIv.setOnClickListener { + setProfileImage(activity) } binding.signup4NextBtn.setOnClickListener { - if(nickok&&independentCareerNotNull&&interestNotNull){ - viewModel.saveUserInfo( - binding.signup4NicknameEt.text.toString(), - interestArray, - binding.signup4ProfileImageIv.resources.toString(), - independentCareerYear!!, - independentCareerMonth!! - ) - findNavController().navigate(R.id.action_signup4_fragment_to_signup5_fragment) + if ( + viewModel.independentCareerok.value && + viewModel.interestok.value && + viewModel.nickok.value + ) { + val bundle= Bundle() + bundle.putString("nickname",binding.signup4NicknameEt.text.toString()) + bundle.putStringArrayList("interest",interestArray) + bundle.putString("imageUri",imageSource) + bundle.putInt("independentCareerYear",independentCareerYear!!) + bundle.putInt("independentCareerMonth",independentCareerMonth!!) + + findNavController().navigate(R.id.action_signup4_fragment_to_signup5_fragment,bundle) + } + } + } + + private lateinit var imageSource:String + private val pickMedia= registerForActivityResult(ActivityResultContracts.PickVisualMedia()){ uri -> + if (uri!=null) { + Glide.with(this).load(uri) + .circleCrop() + .into(binding.signup4ProfileImageIv) + imageSource=getRealPathFromUri(uri,requireContext()) + } else { + Log.d("PhotoPicker", "No media selected") + } + } + private fun setProfileImage(activity: SignupActivity) { + val imageDialog = ImageDialogFragment() + imageDialog.setDialogClickListener(object : ImageDialogFragment.DialogClickListener { + override fun onClick() { + pickMedia.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)) + } + }) + imageDialog.show(activity.supportFragmentManager, imageDialog.toString()) + } + fun getRealPathFromUri(contentUri: Uri, context: Context): String { + var cursor: Cursor? = null + try { + val proj = arrayOf(MediaStore.Video.Media.DATA) + cursor = context.contentResolver.query(contentUri, proj, null, null, null) + val columnIndex = cursor?.getColumnIndexOrThrow(MediaStore.Video.Media.DATA) + if (cursor != null && cursor.moveToFirst()) { + return cursor.getString(columnIndex!!) } + } finally { + cursor?.close() } + return "" } - private fun nextok(){ - if(nickok&&independentCareerNotNull&&interestNotNull){ - binding.signup4NextBtn.isClickable=true + private fun nextok() { + if (viewModel.nickok.value && + viewModel.independentCareerok.value && + viewModel.interestok.value + ) { + binding.signup4NextBtn.isClickable = true binding.signup4NextBtn.setBackgroundResource(R.drawable.rectangle_corner_10_yellow) binding.signup4NextBtn.setTextAppearance(R.style.TextAppearance_App_16sp_700) - }else{ - binding.signup4NextBtn.isClickable=false + } else { + binding.signup4NextBtn.isClickable = false binding.signup4NextBtn.setBackgroundResource(R.drawable.rectangle_corner_10_strok_1_black) binding.signup4NextBtn.setTextAppearance(R.style.TextAppearance_App_16sp_500) } diff --git a/app/src/main/java/com/umc/ttoklip/presentation/signup/fragments/Signup5Fragment.kt b/app/src/main/java/com/umc/ttoklip/presentation/signup/fragments/Signup5Fragment.kt index 7e5f673f..a466c830 100644 --- a/app/src/main/java/com/umc/ttoklip/presentation/signup/fragments/Signup5Fragment.kt +++ b/app/src/main/java/com/umc/ttoklip/presentation/signup/fragments/Signup5Fragment.kt @@ -1,17 +1,27 @@ package com.umc.ttoklip.presentation.signup.fragments import android.content.Intent +import android.os.Bundle import android.widget.SeekBar +import androidx.activity.viewModels import androidx.core.content.ContextCompat +import androidx.fragment.app.activityViewModels +import androidx.fragment.app.viewModels +import androidx.lifecycle.ViewModelProvider import com.umc.ttoklip.R +import com.umc.ttoklip.data.model.signup.SignupRequest import com.umc.ttoklip.databinding.FragmentSignup5Binding import com.umc.ttoklip.presentation.MainActivity import com.umc.ttoklip.presentation.base.BaseFragment +import com.umc.ttoklip.presentation.login.LoginActivity import com.umc.ttoklip.presentation.signup.DirectLocationActivity import com.umc.ttoklip.presentation.signup.LocationActivity import com.umc.ttoklip.presentation.signup.SignupActivity +import com.umc.ttoklip.presentation.signup.SignupViewModel +import dagger.hilt.android.AndroidEntryPoint class Signup5Fragment: BaseFragment(R.layout.fragment_signup5) { + private lateinit var range: String override fun initObserver() { @@ -56,13 +66,24 @@ class Signup5Fragment: BaseFragment(R.layout.fragment_si }) binding.signup5LocationBtn.setOnClickListener { - startActivity(Intent(activity, LocationActivity::class.java)) + val bbundle= requireArguments() + val abundle=Bundle() + abundle.putString("nickname",bbundle.getString("nickname")) + abundle.putStringArrayList("interest",bbundle.getStringArrayList("interest")) + abundle.putString("imageUri",bbundle.getString("imageUri")) + abundle.putInt("independentCareerYear",bbundle.getInt("independentCareerYear")) + abundle.putInt("independentCareerMonth",bbundle.getInt("independentCareerMonth")) + val intent=Intent(activity, LocationActivity::class.java) + intent.putExtra("userInfo",abundle) + startActivity(intent) } binding.signup5LocationDirectEt.setOnClickListener { startActivity(Intent(activity, DirectLocationActivity::class.java)) } binding.signup5NextBtn.setOnClickListener { startActivity(Intent(activity, MainActivity::class.java)) + val loginActivity=LoginActivity.loginActivity + loginActivity?.finish() activity.finish() } } diff --git a/app/src/main/java/com/umc/ttoklip/util/PreferenceUtil.kt b/app/src/main/java/com/umc/ttoklip/util/PreferenceUtil.kt index 3bab1f94..88f54d79 100644 --- a/app/src/main/java/com/umc/ttoklip/util/PreferenceUtil.kt +++ b/app/src/main/java/com/umc/ttoklip/util/PreferenceUtil.kt @@ -12,4 +12,10 @@ class PreferenceUtil(context:Context) { fun setString(key:String,str:String){ prefs.edit().putString(key,str).apply() } + fun getBoolean(key:String,defValue:Boolean):Boolean{ + return prefs.getBoolean(key,defValue) + } + fun setBoolean(key:String,boolean:Boolean){ + prefs.edit().putBoolean(key,boolean).apply() + } } \ No newline at end of file diff --git a/app/src/main/res/drawable/oval_gray40.xml b/app/src/main/res/drawable/oval_gray40.xml new file mode 100644 index 00000000..fc0e9325 --- /dev/null +++ b/app/src/main/res/drawable/oval_gray40.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_signup4.xml b/app/src/main/res/layout/fragment_signup4.xml index 5a42a03c..9671e124 100644 --- a/app/src/main/res/layout/fragment_signup4.xml +++ b/app/src/main/res/layout/fragment_signup4.xml @@ -66,11 +66,10 @@ android:layout_width="95dp" android:layout_height="95dp" android:layout_marginTop="20dp" - android:src="@drawable/oval_stroke_1" + android:src="@drawable/oval_gray40" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - app:tint="@color/gray40" /> + app:layout_constraintTop_toTopOf="parent"/>