From ea7448d4b30b0ddc493744b0340a151ba7bd6bc5 Mon Sep 17 00:00:00 2001 From: kangyuri1114 Date: Tue, 4 Jun 2024 09:45:52 +0900 Subject: [PATCH 1/6] =?UTF-8?q?[feat]:=20=EA=B0=9C=EB=B0=9C=EC=9E=90=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=20API=20=EC=84=B1=EA=B3=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../di/DefaultNavigationProvider.kt | 10 + .../com/zucchini/common/NavigationProvider.kt | 2 + .../res/drawable/submit_button_background.xml | 11 + .../network/datastore/NetworkPreference.kt | 1 + .../datastore/NetworkPreferenceImpl.kt | 8 + .../request/CreateDevelopersRequest.kt | 31 ++ .../network/service/DevelopersService.kt | 11 + .../zucchini/data/DevelopersRepositoryImpl.kt | 22 +- .../java/com/zucchini/mapper/SubmitDevInfo.kt | 20 + .../zucchini/domain/model/SubmitDevInfo.kt | 14 + .../domain/repository/DevelopersRepository.kt | 3 + feature/projects/src/main/AndroidManifest.xml | 13 +- .../java/com/zucchini/auth/LoginActivity.kt | 13 +- .../java/com/zucchini/auth/LoginViewModel.kt | 13 +- .../projects/ProjectDetailActivity.kt | 2 +- .../com/zucchini/submit/SubmitDevActivity.kt | 69 +++ .../com/zucchini/submit/SubmitDevViewModel.kt | 72 +++ .../main/res/layout/activity_submit_dev.xml | 505 ++++++++++++++++++ .../projects/src/main/res/values/strings.xml | 13 + 19 files changed, 823 insertions(+), 10 deletions(-) create mode 100644 core/designsystem/src/main/res/drawable/submit_button_background.xml create mode 100644 core/network/src/main/java/com/sample/network/request/CreateDevelopersRequest.kt create mode 100644 data/src/main/java/com/zucchini/mapper/SubmitDevInfo.kt create mode 100644 domain/src/main/java/com/zucchini/domain/model/SubmitDevInfo.kt create mode 100644 feature/projects/src/main/java/com/zucchini/submit/SubmitDevActivity.kt create mode 100644 feature/projects/src/main/java/com/zucchini/submit/SubmitDevViewModel.kt create mode 100644 feature/projects/src/main/res/layout/activity_submit_dev.xml diff --git a/app/src/main/java/com/zucchini/ssuplector/di/DefaultNavigationProvider.kt b/app/src/main/java/com/zucchini/ssuplector/di/DefaultNavigationProvider.kt index edf89ec..b21f9d4 100644 --- a/app/src/main/java/com/zucchini/ssuplector/di/DefaultNavigationProvider.kt +++ b/app/src/main/java/com/zucchini/ssuplector/di/DefaultNavigationProvider.kt @@ -4,6 +4,8 @@ import android.content.Context import android.content.Intent import com.zucchini.auth.LoginActivity import com.zucchini.common.NavigationProvider +import com.zucchini.projects.MainActivity +import com.zucchini.submit.SubmitDevActivity import dagger.hilt.android.qualifiers.ApplicationContext import javax.inject.Inject @@ -26,4 +28,12 @@ class DefaultNavigationProvider @Inject constructor( override fun toLogin(): Intent { return Intent(context, LoginActivity::class.java) } + + override fun toSubmitDev(): Intent { + return Intent(context, SubmitDevActivity::class.java) + } + + override fun toMain(): Intent { + return Intent(context, MainActivity::class.java) + } } diff --git a/core/common/src/main/java/com/zucchini/common/NavigationProvider.kt b/core/common/src/main/java/com/zucchini/common/NavigationProvider.kt index 14970f4..8964efe 100644 --- a/core/common/src/main/java/com/zucchini/common/NavigationProvider.kt +++ b/core/common/src/main/java/com/zucchini/common/NavigationProvider.kt @@ -8,4 +8,6 @@ interface NavigationProvider { fun toMyPage(): Intent fun toLogin(): Intent + fun toSubmitDev(): Intent + fun toMain(): Intent } diff --git a/core/designsystem/src/main/res/drawable/submit_button_background.xml b/core/designsystem/src/main/res/drawable/submit_button_background.xml new file mode 100644 index 0000000..b158afc --- /dev/null +++ b/core/designsystem/src/main/res/drawable/submit_button_background.xml @@ -0,0 +1,11 @@ + + + diff --git a/core/network/src/main/java/com/sample/network/datastore/NetworkPreference.kt b/core/network/src/main/java/com/sample/network/datastore/NetworkPreference.kt index 1de4c19..eb4a20a 100644 --- a/core/network/src/main/java/com/sample/network/datastore/NetworkPreference.kt +++ b/core/network/src/main/java/com/sample/network/datastore/NetworkPreference.kt @@ -4,6 +4,7 @@ interface NetworkPreference { var accessToken: String var refreshToken: String var developerId: Int + var email: String var autoLoginConfigured: Boolean fun clear() } diff --git a/core/network/src/main/java/com/sample/network/datastore/NetworkPreferenceImpl.kt b/core/network/src/main/java/com/sample/network/datastore/NetworkPreferenceImpl.kt index de68e04..e37193e 100644 --- a/core/network/src/main/java/com/sample/network/datastore/NetworkPreferenceImpl.kt +++ b/core/network/src/main/java/com/sample/network/datastore/NetworkPreferenceImpl.kt @@ -39,6 +39,14 @@ class NetworkPreferenceImpl @Inject constructor( } } + override var email: String + get() = preferences.getString("email", "").orEmpty() + set(value) { + preferences.edit(commit = true) { + putString("email", value) + } + } + override fun clear() { preferences.edit(commit = true) { clear() diff --git a/core/network/src/main/java/com/sample/network/request/CreateDevelopersRequest.kt b/core/network/src/main/java/com/sample/network/request/CreateDevelopersRequest.kt new file mode 100644 index 0000000..cfcf706 --- /dev/null +++ b/core/network/src/main/java/com/sample/network/request/CreateDevelopersRequest.kt @@ -0,0 +1,31 @@ +package com.sample.network.request + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class CreateDevelopersRequest( + @SerialName("shortIntro") + val shortIntro: String, + @SerialName("university") + val university: String, + @SerialName("major") + val major: String, + @SerialName("studentNumber") + val studentNumber: String, + @SerialName("kakaoId") + val kakaoId: String, + @SerialName("githubLink") + val githubLink: String, + @SerialName("part1") + val part1: String, + @SerialName("part2") + val part2: String, + @SerialName("languageList") + val languageList: List, + @SerialName("devToolList") + val devToolList: List, + @SerialName("techStackList") + val techStackList: List, + +) diff --git a/core/network/src/main/java/com/sample/network/service/DevelopersService.kt b/core/network/src/main/java/com/sample/network/service/DevelopersService.kt index b91c530..e334874 100644 --- a/core/network/src/main/java/com/sample/network/service/DevelopersService.kt +++ b/core/network/src/main/java/com/sample/network/service/DevelopersService.kt @@ -3,7 +3,11 @@ package com.sample.network.service import com.sample.network.model.BaseResponse import com.sample.network.reponse.DevelopersDetailResponse import com.sample.network.reponse.DevelopersListResponse +import com.sample.network.request.CreateDevelopersRequest +import retrofit2.http.Body import retrofit2.http.GET +import retrofit2.http.Header +import retrofit2.http.PATCH import retrofit2.http.Path import retrofit2.http.Query @@ -20,4 +24,11 @@ interface DevelopersService { suspend fun getDevelopersDetailData( @Path("developerId") developerId: Int, ): BaseResponse + + @PATCH("/api/developers") + suspend fun createDeveloperInfo( + @Header("Authorization") accessToken: String, + @Query("email") email: String? = null, + @Body request: CreateDevelopersRequest, + ): BaseResponse } diff --git a/data/src/main/java/com/zucchini/data/DevelopersRepositoryImpl.kt b/data/src/main/java/com/zucchini/data/DevelopersRepositoryImpl.kt index 15f14f2..e977e75 100644 --- a/data/src/main/java/com/zucchini/data/DevelopersRepositoryImpl.kt +++ b/data/src/main/java/com/zucchini/data/DevelopersRepositoryImpl.kt @@ -3,7 +3,9 @@ package com.zucchini.data import com.sample.network.service.DevelopersService import com.zucchini.domain.model.DevelopersDetailModel import com.zucchini.domain.model.DevelopersListModel +import com.zucchini.domain.model.SubmitDevInfo import com.zucchini.domain.repository.DevelopersRepository +import com.zucchini.mapper.toCreateDevelopersRequest import com.zucchini.mapper.toDevelopersDetailModel import com.zucchini.mapper.toDevelopersListModel import javax.inject.Inject @@ -11,7 +13,10 @@ import javax.inject.Inject class DevelopersRepositoryImpl @Inject constructor( private val developersService: DevelopersService, ) : DevelopersRepository { - override suspend fun getDevelopersListData(page: Int, part: String?): Result { + override suspend fun getDevelopersListData( + page: Int, + part: String?, + ): Result { return runCatching { developersService.getDevelopersListData( sortType = null, @@ -28,4 +33,19 @@ class DevelopersRepositoryImpl @Inject constructor( developersService.getDevelopersDetailData(developerId).data.toDevelopersDetailModel() } } + + override suspend fun createDeveloperInfo( + accessToken: String, + email: String?, + submitDevInfo: SubmitDevInfo, + ): Result { + return runCatching { + val bearerToken = "Bearer $accessToken" + developersService.createDeveloperInfo( + bearerToken, + email, + submitDevInfo.toCreateDevelopersRequest(), + ).data + } + } } diff --git a/data/src/main/java/com/zucchini/mapper/SubmitDevInfo.kt b/data/src/main/java/com/zucchini/mapper/SubmitDevInfo.kt new file mode 100644 index 0000000..c15fa03 --- /dev/null +++ b/data/src/main/java/com/zucchini/mapper/SubmitDevInfo.kt @@ -0,0 +1,20 @@ +package com.zucchini.mapper + +import com.sample.network.request.CreateDevelopersRequest +import com.zucchini.domain.model.SubmitDevInfo + +internal fun SubmitDevInfo.toCreateDevelopersRequest(): CreateDevelopersRequest { + return CreateDevelopersRequest( + shortIntro = devIntro, + university = devUniversity, + major = devMajor, + studentNumber = devStudentNumber, + kakaoId = "", + githubLink = devGithub, + part1 = devPart1, + part2 = devPart2, + languageList = devLanguageList, + devToolList = devCooperationList, + techStackList = devTechStackList, + ) +} diff --git a/domain/src/main/java/com/zucchini/domain/model/SubmitDevInfo.kt b/domain/src/main/java/com/zucchini/domain/model/SubmitDevInfo.kt new file mode 100644 index 0000000..9d6c5f4 --- /dev/null +++ b/domain/src/main/java/com/zucchini/domain/model/SubmitDevInfo.kt @@ -0,0 +1,14 @@ +package com.zucchini.domain.model + +data class SubmitDevInfo( + val devGithub: String, + val devUniversity: String, + val devMajor: String, + val devIntro: String, + val devStudentNumber: String, + val devPart1: String, + val devPart2: String, + val devTechStackList: List, + val devLanguageList: List, + val devCooperationList: List +) diff --git a/domain/src/main/java/com/zucchini/domain/repository/DevelopersRepository.kt b/domain/src/main/java/com/zucchini/domain/repository/DevelopersRepository.kt index 8e09499..7ecc785 100644 --- a/domain/src/main/java/com/zucchini/domain/repository/DevelopersRepository.kt +++ b/domain/src/main/java/com/zucchini/domain/repository/DevelopersRepository.kt @@ -2,8 +2,11 @@ package com.zucchini.domain.repository import com.zucchini.domain.model.DevelopersDetailModel import com.zucchini.domain.model.DevelopersListModel +import com.zucchini.domain.model.SubmitDevInfo interface DevelopersRepository { suspend fun getDevelopersListData(page: Int, part: String?): Result suspend fun getDevelopersDetailData(developerId: Int): Result + + suspend fun createDeveloperInfo(accessToken: String, email: String? = null, submitDevInfo: SubmitDevInfo): Result } diff --git a/feature/projects/src/main/AndroidManifest.xml b/feature/projects/src/main/AndroidManifest.xml index bb948df..622e53b 100644 --- a/feature/projects/src/main/AndroidManifest.xml +++ b/feature/projects/src/main/AndroidManifest.xml @@ -2,11 +2,16 @@ + + android:theme="@style/Theme.AppCompat.Light.NoActionBar" /> + android:theme="@style/Theme.AppCompat.Light.NoActionBar" + android:windowSoftInputMode="adjustNothing" /> if (viewModel.isLogin.value) { navigateToMain() } else { - // TODO 회원가입 - navigateToMain() + navigateToSubmitDev() } else -> Timber.e("Kakao Login Failed") @@ -68,6 +69,12 @@ class LoginActivity @Inject constructor( finish() } + private fun navigateToSubmitDev() { + intent = Intent(this, SubmitDevActivity::class.java) + .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) + startActivity(intent) + } + private fun setLoginViewPager() { val loginViewImageList = listOf( R.drawable.project_introduction_1, diff --git a/feature/projects/src/main/java/com/zucchini/auth/LoginViewModel.kt b/feature/projects/src/main/java/com/zucchini/auth/LoginViewModel.kt index 6c14cb3..1a0e5b0 100644 --- a/feature/projects/src/main/java/com/zucchini/auth/LoginViewModel.kt +++ b/feature/projects/src/main/java/com/zucchini/auth/LoginViewModel.kt @@ -28,7 +28,6 @@ class LoginViewModel @Inject constructor( private val _isLogin = MutableStateFlow(false) val isLogin = _isLogin.asStateFlow() - fun loginWithKakaoApp(context: Context) { if (UserApiClient.instance.isKakaoTalkLoginAvailable(context)) { UserApiClient.instance.loginWithKakaoTalk(context) { token, error -> @@ -46,6 +45,7 @@ class LoginViewModel @Inject constructor( developerId = it.developerId autoLoginConfigured = true } + loadUserEmail() Log.d( "networkPreference", "accessToken: ${networkPreference.accessToken} refreshToken: ${networkPreference.refreshToken} developerId: ${networkPreference.developerId} autoLoginConfigured: ${networkPreference.autoLoginConfigured}", @@ -77,6 +77,7 @@ class LoginViewModel @Inject constructor( developerId = it.developerId autoLoginConfigured = true } + loadUserEmail() _isLogin.value = it.isLogin _kakaoLoginSuccess.value = true Timber.d("Login Success") @@ -91,4 +92,14 @@ class LoginViewModel @Inject constructor( } } } + + private fun loadUserEmail() { + UserApiClient.instance.me { user, error -> + if (error != null) { + Log.e("KAKAO_API", "사용자 정보 요청 실패", error) + } else if (user != null) { + networkPreference.email = user.kakaoAccount?.email ?: "" + } + } + } } diff --git a/feature/projects/src/main/java/com/zucchini/projects/projects/ProjectDetailActivity.kt b/feature/projects/src/main/java/com/zucchini/projects/projects/ProjectDetailActivity.kt index d2db3e1..3c76423 100644 --- a/feature/projects/src/main/java/com/zucchini/projects/projects/ProjectDetailActivity.kt +++ b/feature/projects/src/main/java/com/zucchini/projects/projects/ProjectDetailActivity.kt @@ -91,7 +91,7 @@ class ProjectDetailActivity : AppCompatActivity() { tvLandingLink.text = it?.infoPageLink tvWebLink.text = it?.webLink - if (it?.languageList?.size == 0 || it?.techStackList == null) { + if (it?.languageList?.size == 0 || it?.techStackList == null) { tvDevStackLanguage1.visibility = android.view.View.INVISIBLE tvDevStackLanguage2.visibility = android.view.View.INVISIBLE tvDevStackLanguage3.visibility = android.view.View.INVISIBLE diff --git a/feature/projects/src/main/java/com/zucchini/submit/SubmitDevActivity.kt b/feature/projects/src/main/java/com/zucchini/submit/SubmitDevActivity.kt new file mode 100644 index 0000000..dac6bd4 --- /dev/null +++ b/feature/projects/src/main/java/com/zucchini/submit/SubmitDevActivity.kt @@ -0,0 +1,69 @@ +package com.zucchini.submit + +import android.os.Bundle +import androidx.activity.viewModels +import androidx.appcompat.app.AppCompatActivity +import com.zucchini.domain.model.SubmitDevInfo +import com.zucchini.feature.projects.databinding.ActivitySubmitDevBinding +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class SubmitDevActivity : AppCompatActivity() { + private lateinit var binding: ActivitySubmitDevBinding + private val viewModel by viewModels() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = ActivitySubmitDevBinding.inflate(layoutInflater) + setContentView(binding.root) + + backToLogin() + collectSubmitDevInfo() + } + + private fun backToLogin() { + binding.ivBackButton.setOnClickListener { + finish() + } + } + + private fun collectSubmitDevInfo() { + binding.btnSubmit.setOnClickListener { + val devGithub = binding.etGithub.text.toString() + val devUniversity = binding.etUniversity.text.toString() + val devMajor = binding.etMajor.text.toString() + val devIntro = binding.etDevIntro.text.toString() + val devStudentNumber = binding.etStudentNumber.text.toString() + val devPart1 = binding.etPartTitle1.text.toString() + val devPart2 = binding.etPartTitle2.text.toString() + val devTechStack1 = binding.etDevStackTech1.text.toString() + val devTechStack2 = binding.etDevStackTech2.text.toString() + val devTechStack3 = binding.etDevStackTech3.text.toString() + val devTechStackList = listOf(devTechStack1, devTechStack2, devTechStack3) + val devLanguage1 = binding.etDevStackLanguage1.text.toString() + val devLanguage2 = binding.etDevStackLanguage2.text.toString() + val devLanguage3 = binding.etDevStackLanguage3.text.toString() + val devLanguageList = listOf(devLanguage1, devLanguage2, devLanguage3) + val devCooperation1 = binding.etDevStackCooperation1.text.toString() + val devCooperation2 = binding.etDevStackCooperation2.text.toString() + val devCooperation3 = binding.etDevStackCooperation3.text.toString() + val devCooperationList = listOf(devCooperation1, devCooperation2, devCooperation3) + + val submitDevInfo = SubmitDevInfo( + devGithub, + devUniversity, + devMajor, + devIntro, + devStudentNumber, + devPart1, + devPart2, + devTechStackList, + devLanguageList, + devCooperationList, + ) + + viewModel.submitDev(submitDevInfo) + viewModel.createDeveloperInfo() + } + } +} diff --git a/feature/projects/src/main/java/com/zucchini/submit/SubmitDevViewModel.kt b/feature/projects/src/main/java/com/zucchini/submit/SubmitDevViewModel.kt new file mode 100644 index 0000000..a89439f --- /dev/null +++ b/feature/projects/src/main/java/com/zucchini/submit/SubmitDevViewModel.kt @@ -0,0 +1,72 @@ +package com.zucchini.submit + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.sample.network.datastore.NetworkPreference +import com.zucchini.domain.model.SubmitDevInfo +import com.zucchini.domain.repository.DevelopersRepository +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class SubmitDevViewModel @Inject constructor( + private val developersRepository: DevelopersRepository, + private val networkPreference: NetworkPreference, +) : ViewModel() { + + private val _devGithub = MutableStateFlow("") + + private val _devUniversity = MutableStateFlow("") + + private val _devMajor = MutableStateFlow("") + + private val _devIntro = MutableStateFlow("") + + private val _devStudentNumber = MutableStateFlow("") + + private val _devPart1 = MutableStateFlow("") + + private val _devPart2 = MutableStateFlow("") + + private val _devToolList = MutableStateFlow>(emptyList()) + + private val _devLanguageList = MutableStateFlow>(emptyList()) + + private val _devTechStackList = MutableStateFlow>(emptyList()) + + fun submitDev(submitDevInfo: SubmitDevInfo) { + _devGithub.value = submitDevInfo.devGithub + _devUniversity.value = submitDevInfo.devUniversity + _devMajor.value = submitDevInfo.devMajor + _devIntro.value = submitDevInfo.devIntro + _devStudentNumber.value = submitDevInfo.devStudentNumber + _devPart1.value = submitDevInfo.devPart1 + _devPart2.value = submitDevInfo.devPart2 + _devTechStackList.value = submitDevInfo.devTechStackList + _devLanguageList.value = submitDevInfo.devLanguageList + _devToolList.value = submitDevInfo.devCooperationList + } + + fun createDeveloperInfo() { + viewModelScope.launch { + developersRepository.createDeveloperInfo( + accessToken = networkPreference.accessToken, + email = networkPreference.email, + submitDevInfo = SubmitDevInfo( + devGithub = _devGithub.value, + devUniversity = _devUniversity.value, + devMajor = _devMajor.value, + devIntro = _devIntro.value, + devStudentNumber = _devStudentNumber.value, + devPart1 = _devPart1.value, + devPart2 = _devPart2.value, + devTechStackList = _devTechStackList.value, + devLanguageList = _devLanguageList.value, + devCooperationList = _devToolList.value, + ), + ) + } + } +} diff --git a/feature/projects/src/main/res/layout/activity_submit_dev.xml b/feature/projects/src/main/res/layout/activity_submit_dev.xml new file mode 100644 index 0000000..1b74365 --- /dev/null +++ b/feature/projects/src/main/res/layout/activity_submit_dev.xml @@ -0,0 +1,505 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/feature/projects/src/main/res/values/strings.xml b/feature/projects/src/main/res/values/strings.xml index 664fda0..34c7240 100644 --- a/feature/projects/src/main/res/values/strings.xml +++ b/feature/projects/src/main/res/values/strings.xml @@ -40,5 +40,18 @@ 로그아웃 회원탈퇴 내 개발자 정보 보러가기 + 내 개발자 프로필 등록하기 + 저는 안드로이드 개발에 관심이 있어요. 함께 하실 분 연락주세요 + 깃허브 링크를 입력해주세요. + 학교 + 전공 + 학교 이름을 입력해주세요. + 전공을 입력해주세요. + 학번 + 학번을 입력해주세요.(ex. 21학번) + 나에 대한 소개 문구를 작성해주세요! + 가장 자신있는 개발 분야 최대 2개를 입력해주세요! + 이름 + 가장 자신있는 기술 스택 최대 3개를 입력해주세요! \ No newline at end of file From 61584542f73f8ffe99e6a03881ca4f4d958dc8a6 Mon Sep 17 00:00:00 2001 From: kangyuri1114 Date: Tue, 4 Jun 2024 13:49:36 +0900 Subject: [PATCH 2/6] =?UTF-8?q?[feat]:=20=EA=B0=9C=EB=B0=9C=EC=9E=90=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=20=ED=8E=98=EC=9D=B4=EC=A7=80,=20=EA=B8=B0?= =?UTF-8?q?=EC=A1=B4=20=EC=B9=B4=EC=B9=B4=EC=98=A4=20=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EB=B6=88=EB=9F=AC=EC=98=A4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../network/datastore/NetworkPreference.kt | 4 +- .../datastore/NetworkPreferenceImpl.kt | 21 ++++++-- .../java/com/zucchini/auth/LoginViewModel.kt | 22 ++++---- .../com/zucchini/projects/MainViewModel.kt | 29 ++++------- .../projects/mypage/MypageFragment.kt | 36 ++++--------- .../com/zucchini/submit/SubmitDevActivity.kt | 52 ++++++++++++++++++- .../com/zucchini/submit/SubmitDevViewModel.kt | 37 ++++++++++++- .../main/res/layout/activity_submit_dev.xml | 8 +-- 8 files changed, 145 insertions(+), 64 deletions(-) diff --git a/core/network/src/main/java/com/sample/network/datastore/NetworkPreference.kt b/core/network/src/main/java/com/sample/network/datastore/NetworkPreference.kt index eb4a20a..665a3be 100644 --- a/core/network/src/main/java/com/sample/network/datastore/NetworkPreference.kt +++ b/core/network/src/main/java/com/sample/network/datastore/NetworkPreference.kt @@ -4,7 +4,9 @@ interface NetworkPreference { var accessToken: String var refreshToken: String var developerId: Int - var email: String + var kakaoEmail: String + var kakaoNickname: String + var kakaoProfileImage: String var autoLoginConfigured: Boolean fun clear() } diff --git a/core/network/src/main/java/com/sample/network/datastore/NetworkPreferenceImpl.kt b/core/network/src/main/java/com/sample/network/datastore/NetworkPreferenceImpl.kt index e37193e..e81fa63 100644 --- a/core/network/src/main/java/com/sample/network/datastore/NetworkPreferenceImpl.kt +++ b/core/network/src/main/java/com/sample/network/datastore/NetworkPreferenceImpl.kt @@ -39,11 +39,26 @@ class NetworkPreferenceImpl @Inject constructor( } } - override var email: String - get() = preferences.getString("email", "").orEmpty() + override var kakaoEmail: String + get() = preferences.getString("kakao_email", "").orEmpty() set(value) { preferences.edit(commit = true) { - putString("email", value) + putString("kakao_email", value) + } + } + + override var kakaoNickname: String + get() = preferences.getString("kakao_nickname", "").orEmpty() + set(value) { + preferences.edit(commit = true) { + putString("kakao_nickname", value) + } + } + override var kakaoProfileImage: String + get() = preferences.getString("kakao_profile_image", "").orEmpty() + set(value) { + preferences.edit(commit = true) { + putString("kakao_profile_image", value) } } diff --git a/feature/projects/src/main/java/com/zucchini/auth/LoginViewModel.kt b/feature/projects/src/main/java/com/zucchini/auth/LoginViewModel.kt index 1a0e5b0..75c4688 100644 --- a/feature/projects/src/main/java/com/zucchini/auth/LoginViewModel.kt +++ b/feature/projects/src/main/java/com/zucchini/auth/LoginViewModel.kt @@ -1,7 +1,6 @@ package com.zucchini.auth import android.content.Context -import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.kakao.sdk.common.model.ClientError @@ -28,6 +27,10 @@ class LoginViewModel @Inject constructor( private val _isLogin = MutableStateFlow(false) val isLogin = _isLogin.asStateFlow() + init { + //getKakaoUserInfo() + } + fun loginWithKakaoApp(context: Context) { if (UserApiClient.instance.isKakaoTalkLoginAvailable(context)) { UserApiClient.instance.loginWithKakaoTalk(context) { token, error -> @@ -45,11 +48,7 @@ class LoginViewModel @Inject constructor( developerId = it.developerId autoLoginConfigured = true } - loadUserEmail() - Log.d( - "networkPreference", - "accessToken: ${networkPreference.accessToken} refreshToken: ${networkPreference.refreshToken} developerId: ${networkPreference.developerId} autoLoginConfigured: ${networkPreference.autoLoginConfigured}", - ) + getKakaoUserInfo() _isLogin.value = it.isLogin _kakaoLoginSuccess.value = true Timber.d("Login Success ${it.accessToken}") @@ -77,7 +76,7 @@ class LoginViewModel @Inject constructor( developerId = it.developerId autoLoginConfigured = true } - loadUserEmail() + getKakaoUserInfo() _isLogin.value = it.isLogin _kakaoLoginSuccess.value = true Timber.d("Login Success") @@ -93,12 +92,15 @@ class LoginViewModel @Inject constructor( } } - private fun loadUserEmail() { + private fun getKakaoUserInfo() { UserApiClient.instance.me { user, error -> if (error != null) { - Log.e("KAKAO_API", "사용자 정보 요청 실패", error) + Timber.e(this.toString()) } else if (user != null) { - networkPreference.email = user.kakaoAccount?.email ?: "" + networkPreference.kakaoEmail = user.kakaoAccount?.email ?: "" + networkPreference.kakaoProfileImage = + user.kakaoAccount?.profile?.thumbnailImageUrl ?: "" + networkPreference.kakaoNickname = user.kakaoAccount?.profile?.nickname ?: "쥬키니" } } } diff --git a/feature/projects/src/main/java/com/zucchini/projects/MainViewModel.kt b/feature/projects/src/main/java/com/zucchini/projects/MainViewModel.kt index 818ad9b..4945bc2 100644 --- a/feature/projects/src/main/java/com/zucchini/projects/MainViewModel.kt +++ b/feature/projects/src/main/java/com/zucchini/projects/MainViewModel.kt @@ -2,22 +2,15 @@ package com.zucchini.projects import androidx.lifecycle.ViewModel import com.kakao.sdk.user.UserApiClient +import com.sample.network.datastore.NetworkPreference import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asStateFlow +import timber.log.Timber import javax.inject.Inject @HiltViewModel -class MainViewModel @Inject constructor() : ViewModel() { - - private val _userNickname = MutableStateFlow("") - val userNickname = _userNickname.asStateFlow() - - private val _userEmail = MutableStateFlow("") - val userEmail = _userEmail.asStateFlow() - - private val _userProfile = MutableStateFlow("") - val userProfile = _userProfile.asStateFlow() +class MainViewModel @Inject constructor( + private val networkPreference: NetworkPreference, +) : ViewModel() { init { getKakaoUserInfo() @@ -26,13 +19,13 @@ class MainViewModel @Inject constructor() : ViewModel() { private fun getKakaoUserInfo() { UserApiClient.instance.me { user, error -> if (error != null) { - _userNickname.value = "" - _userEmail.value = "" - _userProfile.value = "" + Timber.e("failed to get user info: $error") } else if (user != null) { - _userNickname.value = user.kakaoAccount?.profile?.nickname ?: "no nickname" - _userEmail.value = user.kakaoAccount?.email ?: "no email" - _userProfile.value = user.kakaoAccount?.profile?.thumbnailImageUrl ?: "" + networkPreference.kakaoNickname = + user.kakaoAccount?.profile?.nickname ?: "no nickname" + networkPreference.kakaoEmail = user.kakaoAccount?.email ?: "no email" + networkPreference.kakaoProfileImage = + user.kakaoAccount?.profile?.thumbnailImageUrl ?: "" } } } diff --git a/feature/projects/src/main/java/com/zucchini/projects/mypage/MypageFragment.kt b/feature/projects/src/main/java/com/zucchini/projects/mypage/MypageFragment.kt index 73e713d..6a7b74f 100644 --- a/feature/projects/src/main/java/com/zucchini/projects/mypage/MypageFragment.kt +++ b/feature/projects/src/main/java/com/zucchini/projects/mypage/MypageFragment.kt @@ -7,16 +7,15 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment -import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope import coil.load import coil.transform.RoundedCornersTransformation +import com.sample.network.datastore.NetworkPreference import com.zucchini.common.NavigationProvider import com.zucchini.feature.projects.R import com.zucchini.feature.projects.databinding.FragmentMypageBinding -import com.zucchini.projects.MainViewModel import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @@ -26,13 +25,14 @@ import javax.inject.Inject class MypageFragment : Fragment() { private var _binding: FragmentMypageBinding? = null private val binding: FragmentMypageBinding get() = _binding!! - - private val mainViewModel by activityViewModels() private val viewModel by viewModels() @Inject lateinit var navigationProvider: NavigationProvider + @Inject + lateinit var networkPreference: NetworkPreference + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -87,27 +87,13 @@ class MypageFragment : Fragment() { } private fun loadMyKakaoInfo() { - mainViewModel.userEmail.flowWithLifecycle(viewLifecycleOwner.lifecycle) - .onEach { email -> - binding.tvUserEmail.text = email - } - .launchIn(viewLifecycleOwner.lifecycleScope) - - mainViewModel.userNickname.flowWithLifecycle(viewLifecycleOwner.lifecycle) - .onEach { nickname -> - binding.tvUserName.text = nickname - } - .launchIn(viewLifecycleOwner.lifecycleScope) - - mainViewModel.userProfile.flowWithLifecycle(viewLifecycleOwner.lifecycle) - .onEach { image -> - binding.ivDeveloperImage.load(image) { - crossfade(true) - placeholder(R.drawable.developer_default_image) - transformations(RoundedCornersTransformation()) - } - } - .launchIn(viewLifecycleOwner.lifecycleScope) + binding.tvUserEmail.text = networkPreference.kakaoEmail + binding.tvUserName.text = networkPreference.kakaoNickname + binding.ivDeveloperImage.load(networkPreference.kakaoProfileImage) { + crossfade(true) + placeholder(R.drawable.developer_default_image) + transformations(RoundedCornersTransformation()) + } } private fun collectLogoutState() { diff --git a/feature/projects/src/main/java/com/zucchini/submit/SubmitDevActivity.kt b/feature/projects/src/main/java/com/zucchini/submit/SubmitDevActivity.kt index dac6bd4..a310b7d 100644 --- a/feature/projects/src/main/java/com/zucchini/submit/SubmitDevActivity.kt +++ b/feature/projects/src/main/java/com/zucchini/submit/SubmitDevActivity.kt @@ -1,24 +1,40 @@ package com.zucchini.submit +import android.content.Intent import android.os.Bundle import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.flowWithLifecycle +import androidx.lifecycle.lifecycleScope +import coil.load +import coil.transform.RoundedCornersTransformation +import com.sample.network.datastore.NetworkPreference import com.zucchini.domain.model.SubmitDevInfo +import com.zucchini.feature.projects.R import com.zucchini.feature.projects.databinding.ActivitySubmitDevBinding +import com.zucchini.projects.MainActivity import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import javax.inject.Inject @AndroidEntryPoint -class SubmitDevActivity : AppCompatActivity() { +class SubmitDevActivity @Inject constructor() : AppCompatActivity() { private lateinit var binding: ActivitySubmitDevBinding private val viewModel by viewModels() + @Inject + lateinit var networkPreference: NetworkPreference + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivitySubmitDevBinding.inflate(layoutInflater) setContentView(binding.root) + getUserDefaultInfo() backToLogin() collectSubmitDevInfo() + collectSubmitDevInfoSuccess() } private fun backToLogin() { @@ -27,6 +43,24 @@ class SubmitDevActivity : AppCompatActivity() { } } + private fun getUserDefaultInfo() { + viewModel.kakaoNickname.flowWithLifecycle(lifecycle).onEach { nickname -> + if (nickname.isNotEmpty()) { + binding.tvDevSubmitName.text = viewModel.kakaoNickname.value + } + }.launchIn(lifecycleScope) + + viewModel.kakaoImage.flowWithLifecycle(lifecycle).onEach { image -> + if (image.isNotEmpty()) { + binding.ivDevSubmitProfile.load(viewModel.kakaoImage.value) { + crossfade(true) + placeholder(R.drawable.developer_default_image) + transformations(RoundedCornersTransformation()) + } + } + }.launchIn(lifecycleScope) + } + private fun collectSubmitDevInfo() { binding.btnSubmit.setOnClickListener { val devGithub = binding.etGithub.text.toString() @@ -66,4 +100,20 @@ class SubmitDevActivity : AppCompatActivity() { viewModel.createDeveloperInfo() } } + + private fun collectSubmitDevInfoSuccess() { + viewModel.submitDevInfoSuccess.flowWithLifecycle(lifecycle).onEach { success -> + if (success) { + navigateToMain() + finish() + } + }.launchIn(lifecycleScope) + } + + private fun navigateToMain() { + intent = Intent(this, MainActivity::class.java) + .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) + startActivity(intent) + finish() + } } diff --git a/feature/projects/src/main/java/com/zucchini/submit/SubmitDevViewModel.kt b/feature/projects/src/main/java/com/zucchini/submit/SubmitDevViewModel.kt index a89439f..144dac0 100644 --- a/feature/projects/src/main/java/com/zucchini/submit/SubmitDevViewModel.kt +++ b/feature/projects/src/main/java/com/zucchini/submit/SubmitDevViewModel.kt @@ -2,12 +2,15 @@ package com.zucchini.submit import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.kakao.sdk.user.UserApiClient import com.sample.network.datastore.NetworkPreference import com.zucchini.domain.model.SubmitDevInfo import com.zucchini.domain.repository.DevelopersRepository import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch +import timber.log.Timber import javax.inject.Inject @HiltViewModel @@ -36,6 +39,19 @@ class SubmitDevViewModel @Inject constructor( private val _devTechStackList = MutableStateFlow>(emptyList()) + private val _submitDevInfoSuccess = MutableStateFlow(false) + val submitDevInfoSuccess = _submitDevInfoSuccess.asStateFlow() + + private val _kakaoNickname = MutableStateFlow("") + val kakaoNickname = _kakaoNickname.asStateFlow() + + private val _kakaoImage = MutableStateFlow("") + val kakaoImage = _kakaoImage.asStateFlow() + + init { + getKakaoUserInfo() + } + fun submitDev(submitDevInfo: SubmitDevInfo) { _devGithub.value = submitDevInfo.devGithub _devUniversity.value = submitDevInfo.devUniversity @@ -53,7 +69,7 @@ class SubmitDevViewModel @Inject constructor( viewModelScope.launch { developersRepository.createDeveloperInfo( accessToken = networkPreference.accessToken, - email = networkPreference.email, + email = networkPreference.kakaoEmail, submitDevInfo = SubmitDevInfo( devGithub = _devGithub.value, devUniversity = _devUniversity.value, @@ -66,7 +82,24 @@ class SubmitDevViewModel @Inject constructor( devLanguageList = _devLanguageList.value, devCooperationList = _devToolList.value, ), - ) + ).onSuccess { + _submitDevInfoSuccess.value = true + }.onFailure { + _submitDevInfoSuccess.value = false + Timber.e(it) + } + } + } + + private fun getKakaoUserInfo() { + UserApiClient.instance.me { user, error -> + if (error != null) { + Timber.e(this.toString()) + } else if (user != null) { + _kakaoImage.value = + user.kakaoAccount?.profile?.thumbnailImageUrl ?: "" + _kakaoNickname.value = user.kakaoAccount?.profile?.nickname ?: "쥬키니" + } } } } diff --git a/feature/projects/src/main/res/layout/activity_submit_dev.xml b/feature/projects/src/main/res/layout/activity_submit_dev.xml index 1b74365..56fed0f 100644 --- a/feature/projects/src/main/res/layout/activity_submit_dev.xml +++ b/feature/projects/src/main/res/layout/activity_submit_dev.xml @@ -45,7 +45,7 @@ + app:layout_constraintTop_toBottomOf="@+id/tv_dev_submit_name" /> Date: Wed, 5 Jun 2024 02:28:22 +0900 Subject: [PATCH 3/6] =?UTF-8?q?[feat]:=20=EB=94=94=EC=9E=90=EC=9D=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=B0=8F=20=EC=B6=94=EA=B0=80=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/zucchini/mapper/SubmitDevInfo.kt | 2 +- .../zucchini/domain/model/SubmitDevInfo.kt | 1 + .../java/com/zucchini/auth/LoginActivity.kt | 3 +- .../projects/developer/DevDetailActivity.kt | 65 +++-------------- .../developer/adapter/DeveloperInfoAdapter.kt | 10 ++- .../projects/mypage/MypageFragment.kt | 5 +- .../projects/ProjectDetailActivity.kt | 72 ++++--------------- .../projects/projects/ProjectsFragment.kt | 4 +- .../projects/adapter/ProjectsAdapter.kt | 5 +- .../com/zucchini/submit/SubmitDevActivity.kt | 22 +++--- .../com/zucchini/submit/SubmitDevViewModel.kt | 4 ++ .../res/layout/activity_project_detail.xml | 60 ++++++++-------- .../main/res/layout/activity_submit_dev.xml | 53 +++++++++++--- .../src/main/res/layout/fragment_mypage.xml | 7 +- .../src/main/res/layout/item_developer.xml | 2 +- .../src/main/res/layout/item_projects.xml | 34 +++++---- .../projects/src/main/res/values/strings.xml | 13 +++- 17 files changed, 165 insertions(+), 197 deletions(-) diff --git a/data/src/main/java/com/zucchini/mapper/SubmitDevInfo.kt b/data/src/main/java/com/zucchini/mapper/SubmitDevInfo.kt index c15fa03..e663bf8 100644 --- a/data/src/main/java/com/zucchini/mapper/SubmitDevInfo.kt +++ b/data/src/main/java/com/zucchini/mapper/SubmitDevInfo.kt @@ -9,7 +9,7 @@ internal fun SubmitDevInfo.toCreateDevelopersRequest(): CreateDevelopersRequest university = devUniversity, major = devMajor, studentNumber = devStudentNumber, - kakaoId = "", + kakaoId = kakaoId, githubLink = devGithub, part1 = devPart1, part2 = devPart2, diff --git a/domain/src/main/java/com/zucchini/domain/model/SubmitDevInfo.kt b/domain/src/main/java/com/zucchini/domain/model/SubmitDevInfo.kt index 9d6c5f4..b8986ab 100644 --- a/domain/src/main/java/com/zucchini/domain/model/SubmitDevInfo.kt +++ b/domain/src/main/java/com/zucchini/domain/model/SubmitDevInfo.kt @@ -5,6 +5,7 @@ data class SubmitDevInfo( val devUniversity: String, val devMajor: String, val devIntro: String, + val kakaoId: String, val devStudentNumber: String, val devPart1: String, val devPart2: String, diff --git a/feature/projects/src/main/java/com/zucchini/auth/LoginActivity.kt b/feature/projects/src/main/java/com/zucchini/auth/LoginActivity.kt index 4023d73..eb16d2a 100644 --- a/feature/projects/src/main/java/com/zucchini/auth/LoginActivity.kt +++ b/feature/projects/src/main/java/com/zucchini/auth/LoginActivity.kt @@ -6,7 +6,6 @@ import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope -import com.zucchini.common.NavigationProvider import com.zucchini.feature.projects.R import com.zucchini.feature.projects.databinding.ActivityLoginBinding import com.zucchini.projects.MainActivity @@ -24,7 +23,7 @@ import javax.inject.Inject @AndroidEntryPoint class LoginActivity @Inject constructor( - //private val navigationProvider: NavigationProvider, + // private val navigationProvider: NavigationProvider, ) : AppCompatActivity() { private lateinit var binding: ActivityLoginBinding diff --git a/feature/projects/src/main/java/com/zucchini/projects/developer/DevDetailActivity.kt b/feature/projects/src/main/java/com/zucchini/projects/developer/DevDetailActivity.kt index 53fa6aa..116392b 100644 --- a/feature/projects/src/main/java/com/zucchini/projects/developer/DevDetailActivity.kt +++ b/feature/projects/src/main/java/com/zucchini/projects/developer/DevDetailActivity.kt @@ -78,7 +78,7 @@ class DevDetailActivity : AppCompatActivity() { private fun bindDevDetailView(it: DevelopersDetailModel?) { binding.run { ivProjectDetail.load( - it?.imageLink?.toIntOrNull() + it?.imageLink ?: R.drawable.project_profile_default, ) tvProjectName.text = it?.name @@ -89,60 +89,15 @@ class DevDetailActivity : AppCompatActivity() { tvKakaoid.text = it?.kakaoId tvEmail.text = it?.email tvProjectIntroContentLong.text = it?.shortIntro - - if (it?.devToolList?.size == 0 || it?.techStackList == null) { - tvDevStackCooperation1.visibility = android.view.View.INVISIBLE - tvDevStackCooperation2.visibility = android.view.View.INVISIBLE - tvDevStackCooperation3.visibility = android.view.View.INVISIBLE - } else if (it.devToolList?.size == 1) { - tvDevStackCooperation1.text = it.devToolList?.get(0) ?: "" - tvDevStackCooperation2.visibility = android.view.View.INVISIBLE - tvDevStackCooperation3.visibility = android.view.View.INVISIBLE - } else if (it.devToolList?.size == 2) { - tvDevStackCooperation1.text = it.devToolList?.get(0) ?: "" - tvDevStackCooperation2.text = it.devToolList?.get(1) ?: "" - tvDevStackCooperation3.visibility = android.view.View.INVISIBLE - } else if (it.devToolList?.size == 3) { - tvDevStackCooperation1.text = it.devToolList?.get(0) ?: "" - tvDevStackCooperation2.text = it.devToolList?.get(1) ?: "" - tvDevStackCooperation3.text = it.devToolList?.get(2) ?: "" - } - - if (it?.languageList?.size == 0 || it?.techStackList == null) { - tvDevStackLanguage1.visibility = android.view.View.INVISIBLE - tvDevStackLanguage2.visibility = android.view.View.INVISIBLE - tvDevStackLanguage3.visibility = android.view.View.INVISIBLE - } else if (it.languageList?.size == 1) { - tvDevStackLanguage1.text = it.languageList?.get(0) ?: "" - tvDevStackLanguage2.visibility = android.view.View.INVISIBLE - tvDevStackLanguage3.visibility = android.view.View.INVISIBLE - } else if (it.languageList?.size == 2) { - tvDevStackLanguage1.text = it.languageList?.get(0) ?: "" - tvDevStackLanguage2.text = it.languageList?.get(1) ?: "" - tvDevStackLanguage3.visibility = android.view.View.INVISIBLE - } else if (it.languageList?.size == 3) { - tvDevStackLanguage1.text = it.languageList?.get(0) ?: "" - tvDevStackLanguage2.text = it.languageList?.get(1) ?: "" - tvDevStackLanguage3.text = it.languageList?.get(2) ?: "" - } - - if (it?.techStackList?.size == 0 || it?.techStackList == null) { - tvDevStackTech1.visibility = android.view.View.INVISIBLE - tvDevStackTech2.visibility = android.view.View.INVISIBLE - tvDevStackTech3.visibility = android.view.View.INVISIBLE - } else if (it.techStackList?.size == 1) { - tvDevStackTech1.text = it.techStackList?.get(0) ?: "" - tvDevStackTech2.visibility = android.view.View.INVISIBLE - tvDevStackTech3.visibility = android.view.View.INVISIBLE - } else if (it.techStackList?.size == 2) { - tvDevStackTech1.text = it.techStackList?.get(0) ?: "" - tvDevStackTech2.text = it.techStackList?.get(1) ?: "" - tvDevStackTech3.visibility = android.view.View.INVISIBLE - } else if (it.techStackList?.size == 3) { - tvDevStackTech1.text = it.techStackList?.get(0) ?: "" - tvDevStackTech2.text = it.techStackList?.get(1) ?: "" - tvDevStackTech3.text = it.techStackList?.get(2) ?: "" - } + tvDevStackCooperation1.text = it?.devToolList?.get(0) ?: "" + tvDevStackCooperation2.text = it?.devToolList?.get(1) ?: "" + tvDevStackCooperation3.text = it?.devToolList?.get(2) ?: "" + tvDevStackLanguage1.text = it?.languageList?.get(0) ?: "" + tvDevStackLanguage2.text = it?.languageList?.get(1) ?: "" + tvDevStackLanguage3.text = it?.languageList?.get(2) ?: "" + tvDevStackTech1.text = it?.techStackList?.get(0) ?: "" + tvDevStackTech2.text = it?.techStackList?.get(1) ?: "" + tvDevStackTech3.text = it?.techStackList?.get(2) ?: "" } } } diff --git a/feature/projects/src/main/java/com/zucchini/projects/developer/adapter/DeveloperInfoAdapter.kt b/feature/projects/src/main/java/com/zucchini/projects/developer/adapter/DeveloperInfoAdapter.kt index 6e71a40..6e20cf8 100644 --- a/feature/projects/src/main/java/com/zucchini/projects/developer/adapter/DeveloperInfoAdapter.kt +++ b/feature/projects/src/main/java/com/zucchini/projects/developer/adapter/DeveloperInfoAdapter.kt @@ -6,6 +6,7 @@ import android.view.ViewGroup import androidx.core.content.ContextCompat.startActivity import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView +import coil.load import com.zucchini.domain.model.DeveloperDetailInfoInListModel import com.zucchini.feature.projects.databinding.ItemDeveloperBinding import com.zucchini.projects.developer.DevDetailActivity @@ -36,10 +37,13 @@ class DeveloperInfoAdapter : RecyclerView.ViewHolder(binding.root) { fun bind(developersInfoInList: DeveloperDetailInfoInListModel) { binding.run { - ivProjectProfile.setImageResource( - developersInfoInList.imageLink?.toIntOrNull() + ivProjectProfile.load( + developersInfoInList.imageLink ?: com.zucchini.core.designsystem.R.drawable.project_profile_default, - ) + ) { + crossfade(true) + placeholder(com.zucchini.core.designsystem.R.drawable.project_profile_default) + } tvDeveloperName.text = developersInfoInList.name tvDeveloperField.text = "${developersInfoInList.part1}\n${developersInfoInList.part2}" diff --git a/feature/projects/src/main/java/com/zucchini/projects/mypage/MypageFragment.kt b/feature/projects/src/main/java/com/zucchini/projects/mypage/MypageFragment.kt index 6a7b74f..af6b9e8 100644 --- a/feature/projects/src/main/java/com/zucchini/projects/mypage/MypageFragment.kt +++ b/feature/projects/src/main/java/com/zucchini/projects/mypage/MypageFragment.kt @@ -16,6 +16,7 @@ import com.sample.network.datastore.NetworkPreference import com.zucchini.common.NavigationProvider import com.zucchini.feature.projects.R import com.zucchini.feature.projects.databinding.FragmentMypageBinding +import com.zucchini.projects.developer.DevDetailActivity import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @@ -75,7 +76,9 @@ class MypageFragment : Fragment() { private fun navigateToMyDevInfo() { binding.tvNavigateToMyInfo.setOnClickListener { - // TODO 개발자 상세정보로 이동 + val intent = Intent(context, DevDetailActivity::class.java) + intent.putExtra("developerId", networkPreference.developerId) + startActivity(intent) } } diff --git a/feature/projects/src/main/java/com/zucchini/projects/projects/ProjectDetailActivity.kt b/feature/projects/src/main/java/com/zucchini/projects/projects/ProjectDetailActivity.kt index 3c76423..4fcacf9 100644 --- a/feature/projects/src/main/java/com/zucchini/projects/projects/ProjectDetailActivity.kt +++ b/feature/projects/src/main/java/com/zucchini/projects/projects/ProjectDetailActivity.kt @@ -1,6 +1,7 @@ package com.zucchini.projects.projects import android.content.Intent +import android.graphics.Paint import android.net.Uri import android.os.Bundle import androidx.activity.viewModels @@ -81,69 +82,26 @@ class ProjectDetailActivity : AppCompatActivity() { val projectGithubLink = it?.githubLink ?: getString(com.zucchini.feature.projects.R.string.github_default_link) + tvGithub.paintFlags = Paint.UNDERLINE_TEXT_FLAG + tvProjectName.text = it?.name tvProjectSorted.text = it?.category tvProjectClicked.text = "조회수 +${it?.hits}" tvProjectIntroContent.text = it?.shortIntro tvProjectIntroContentLong.text = it?.longIntro tvGithub.text = projectGithubLink - tvAppLink.text = it?.appLink - tvLandingLink.text = it?.infoPageLink - tvWebLink.text = it?.webLink - - if (it?.languageList?.size == 0 || it?.techStackList == null) { - tvDevStackLanguage1.visibility = android.view.View.INVISIBLE - tvDevStackLanguage2.visibility = android.view.View.INVISIBLE - tvDevStackLanguage3.visibility = android.view.View.INVISIBLE - } else if (it.languageList?.size == 1) { - tvDevStackLanguage1.text = it.languageList?.get(0) ?: "" - tvDevStackLanguage2.visibility = android.view.View.INVISIBLE - tvDevStackLanguage3.visibility = android.view.View.INVISIBLE - } else if (it.languageList?.size == 2) { - tvDevStackLanguage1.text = it.languageList?.get(0) ?: "" - tvDevStackLanguage2.text = it.languageList?.get(1) ?: "" - tvDevStackLanguage3.visibility = android.view.View.INVISIBLE - } else if (it.languageList?.size == 3) { - tvDevStackLanguage1.text = it.languageList?.get(0) ?: "" - tvDevStackLanguage2.text = it.languageList?.get(1) ?: "" - tvDevStackLanguage3.text = it.languageList?.get(2) ?: "" - } - - if (it?.devToolList?.size == 0 || it?.techStackList == null) { - tvDevStackCooperation1.visibility = android.view.View.INVISIBLE - tvDevStackCooperation2.visibility = android.view.View.INVISIBLE - tvDevStackCooperation3.visibility = android.view.View.INVISIBLE - } else if (it.devToolList?.size == 1) { - tvDevStackCooperation1.text = it.devToolList?.get(0) ?: "" - tvDevStackCooperation2.visibility = android.view.View.INVISIBLE - tvDevStackCooperation3.visibility = android.view.View.INVISIBLE - } else if (it.devToolList?.size == 2) { - tvDevStackCooperation1.text = it.devToolList?.get(0) ?: "" - tvDevStackCooperation2.text = it.devToolList?.get(1) ?: "" - tvDevStackCooperation3.visibility = android.view.View.INVISIBLE - } else if (it.devToolList?.size == 3) { - tvDevStackCooperation1.text = it.devToolList?.get(0) ?: "" - tvDevStackCooperation2.text = it.devToolList?.get(1) ?: "" - tvDevStackCooperation3.text = it.devToolList?.get(2) ?: "" - } - - if (it?.techStackList?.size == 0 || it?.techStackList == null) { - tvDevStackTech1.visibility = android.view.View.INVISIBLE - tvDevStackTech2.visibility = android.view.View.INVISIBLE - tvDevStackTech3.visibility = android.view.View.INVISIBLE - } else if (it.techStackList?.size == 1) { - tvDevStackTech1.text = it.techStackList?.get(0) ?: "" - tvDevStackTech2.visibility = android.view.View.INVISIBLE - tvDevStackTech3.visibility = android.view.View.INVISIBLE - } else if (it.techStackList?.size == 2) { - tvDevStackTech1.text = it.techStackList?.get(0) ?: "" - tvDevStackTech2.text = it.techStackList?.get(1) ?: "" - tvDevStackTech3.visibility = android.view.View.INVISIBLE - } else if (it.techStackList?.size == 3) { - tvDevStackTech1.text = it.techStackList?.get(0) ?: "" - tvDevStackTech2.text = it.techStackList?.get(1) ?: "" - tvDevStackTech3.text = it.techStackList?.get(2) ?: "" - } + tvAppLink.text = it?.appLink ?: "아직 출시되지 않았어요!" + tvLandingLink.text = it?.infoPageLink ?: "준비 중입니다 :)" + tvWebLink.text = it?.webLink ?: "준비 중입니다 :)" + tvDevStackLanguage1.text = it?.languageList?.get(0) ?: "" + tvDevStackLanguage2.text = it?.languageList?.get(1) ?: "" + tvDevStackLanguage3.text = it?.languageList?.get(2) ?: "" + tvDevStackCooperation1.text = it?.devToolList?.get(0) ?: "" + tvDevStackCooperation2.text = it?.devToolList?.get(1) ?: "" + tvDevStackCooperation3.text = it?.devToolList?.get(2) ?: "" + tvDevStackTech1.text = it?.techStackList?.get(0) ?: "" + tvDevStackTech2.text = it?.techStackList?.get(1) ?: "" + tvDevStackTech3.text = it?.techStackList?.get(2) ?: "" navigateToProjectGithubLink(projectGithubLink) navigateToProjectLandingPageLink(it?.infoPageLink) diff --git a/feature/projects/src/main/java/com/zucchini/projects/projects/ProjectsFragment.kt b/feature/projects/src/main/java/com/zucchini/projects/projects/ProjectsFragment.kt index 205d434..af4e7f9 100644 --- a/feature/projects/src/main/java/com/zucchini/projects/projects/ProjectsFragment.kt +++ b/feature/projects/src/main/java/com/zucchini/projects/projects/ProjectsFragment.kt @@ -91,10 +91,10 @@ class ProjectsFragment : Fragment() { private fun updateSortKeywordColors(selectedOption: SortOption) { val activeColor = ContextCompat.getColor( requireContext(), - com.zucchini.core.designsystem.R.color.olive_black, + R.color.olive_black, ) val inactiveColor = - ContextCompat.getColor(requireContext(), com.zucchini.core.designsystem.R.color.gray1) + ContextCompat.getColor(requireContext(), R.color.gray1) binding.run { tvSortRecent.setTextColor(if (selectedOption == SortOption.RECENT) activeColor else inactiveColor) diff --git a/feature/projects/src/main/java/com/zucchini/projects/projects/adapter/ProjectsAdapter.kt b/feature/projects/src/main/java/com/zucchini/projects/projects/adapter/ProjectsAdapter.kt index e1f40bb..6151883 100644 --- a/feature/projects/src/main/java/com/zucchini/projects/projects/adapter/ProjectsAdapter.kt +++ b/feature/projects/src/main/java/com/zucchini/projects/projects/adapter/ProjectsAdapter.kt @@ -6,6 +6,7 @@ import android.view.ViewGroup import androidx.core.content.ContextCompat.startActivity import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView +import coil.load import com.zucchini.domain.model.ProjectListInfoInList import com.zucchini.feature.projects.databinding.ItemProjectsBinding import com.zucchini.projects.projects.ProjectDetailActivity @@ -34,8 +35,8 @@ class ProjectsAdapter : ListAdapter>(emptyList()) + private val _kakaoId = MutableStateFlow("") + private val _submitDevInfoSuccess = MutableStateFlow(false) val submitDevInfoSuccess = _submitDevInfoSuccess.asStateFlow() @@ -63,6 +65,7 @@ class SubmitDevViewModel @Inject constructor( _devTechStackList.value = submitDevInfo.devTechStackList _devLanguageList.value = submitDevInfo.devLanguageList _devToolList.value = submitDevInfo.devCooperationList + _kakaoId.value = submitDevInfo.kakaoId } fun createDeveloperInfo() { @@ -76,6 +79,7 @@ class SubmitDevViewModel @Inject constructor( devMajor = _devMajor.value, devIntro = _devIntro.value, devStudentNumber = _devStudentNumber.value, + kakaoId = _kakaoId.value, devPart1 = _devPart1.value, devPart2 = _devPart2.value, devTechStackList = _devTechStackList.value, diff --git a/feature/projects/src/main/res/layout/activity_project_detail.xml b/feature/projects/src/main/res/layout/activity_project_detail.xml index 15c81c3..2d2de4a 100644 --- a/feature/projects/src/main/res/layout/activity_project_detail.xml +++ b/feature/projects/src/main/res/layout/activity_project_detail.xml @@ -60,7 +60,6 @@ android:layout_height="wrap_content" android:layout_marginEnd="10dp" android:fontFamily="@font/pretendardbold" - android:text="조회수 +12" android:textColor="@color/olive_black" android:textSize="10sp" app:layout_constraintBottom_toTopOf="@+id/cl_project_info" @@ -83,7 +82,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:fontFamily="@font/pretendardblack" - android:text="슈플렉터" + tools:text="슈플렉터" android:textColor="@color/olive_black" android:textSize="20sp" app:layout_constraintStart_toStartOf="parent" @@ -93,17 +92,17 @@ android:id="@+id/tv_project_sorted" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="10dp" android:layout_marginTop="10dp" + android:layout_marginStart="15dp" android:layout_marginEnd="5dp" - android:fontFamily="@font/pretendardblack" + android:fontFamily="@font/pretendardbold" android:gravity="left|center_horizontal" - android:text="안드로이드 앱 서비스" - android:textColor="@color/gray2" - android:textSize="10sp" + tools:text="안드로이드 앱 서비스" + android:textColor="@color/main_olive" + android:textSize="13sp" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintStart_toEndOf="@id/tv_project_name" - app:layout_constraintTop_toTopOf="@+id/tv_project_name" /> + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@+id/tv_project_name" /> + app:layout_constraintTop_toBottomOf="@+id/tv_project_sorted" /> + app:layout_constraintTop_toBottomOf="@+id/tv_dev_stack_language_title" + tools:text="JAVA" /> + app:layout_constraintTop_toBottomOf="@+id/tv_dev_stack_language_title" + tools:text="Kotlin" /> + app:layout_constraintTop_toBottomOf="@+id/tv_dev_stack_language_title" + tools:text="MYSQL" /> + app:layout_constraintTop_toBottomOf="@+id/tv_dev_stack_title" + tools:text="Android" /> + app:layout_constraintTop_toBottomOf="@+id/tv_dev_stack_title" + tools:text="Crawling" /> + app:layout_constraintTop_toBottomOf="@+id/tv_dev_stack_title" + tools:text="Spring" /> + app:layout_constraintTop_toBottomOf="@+id/tv_dev_cooperation_title" + tools:text="Discord" /> + app:layout_constraintTop_toBottomOf="@+id/tv_dev_cooperation_title" + tools:text="Github" /> + app:layout_constraintTop_toBottomOf="@+id/tv_dev_cooperation_title" + tools:text="Slack" /> diff --git a/feature/projects/src/main/res/layout/activity_submit_dev.xml b/feature/projects/src/main/res/layout/activity_submit_dev.xml index 56fed0f..3c2b332 100644 --- a/feature/projects/src/main/res/layout/activity_submit_dev.xml +++ b/feature/projects/src/main/res/layout/activity_submit_dev.xml @@ -196,6 +196,37 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/tv_student_number_title" /> + + + + + \ No newline at end of file diff --git a/feature/projects/src/main/res/values/strings.xml b/feature/projects/src/main/res/values/strings.xml index 34c7240..01cae56 100644 --- a/feature/projects/src/main/res/values/strings.xml +++ b/feature/projects/src/main/res/values/strings.xml @@ -42,16 +42,25 @@ 내 개발자 정보 보러가기 내 개발자 프로필 등록하기 저는 안드로이드 개발에 관심이 있어요. 함께 하실 분 연락주세요 - 깃허브 링크를 입력해주세요. + 깃허브 아이디를 입력해주세요. 학교 전공 학교 이름을 입력해주세요. 전공을 입력해주세요. 학번 - 학번을 입력해주세요.(ex. 21학번) + 학번을 입력해주세요.(ex. 21) 나에 대한 소개 문구를 작성해주세요! 가장 자신있는 개발 분야 최대 2개를 입력해주세요! 이름 가장 자신있는 기술 스택 최대 3개를 입력해주세요! + 로그인에 성공하였습니다. + 회원가입이 필요합니다. + 로그인에 실패하였습니다. + 로그아웃 되었습니다. + 로그아웃에 실패하였습니다. + 탈퇴 되었습니다. + 회원탈퇴에 실패하였습니다. + 연락이 가능한 카카오 아이디를 입력해주세요 + 카카오톡 아이디 \ No newline at end of file From c0e34eb3a0de8e385e71bb36213968b8330ba721 Mon Sep 17 00:00:00 2001 From: kangyuri1114 Date: Wed, 5 Jun 2024 15:47:59 +0900 Subject: [PATCH 4/6] =?UTF-8?q?[fix]:=20=EA=B0=9C=EB=B0=9C=EC=9E=90=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=82=B4=20?= =?UTF-8?q?=ED=94=84=EB=A1=9C=EC=A0=9D=ED=8A=B8=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80=20=EB=A1=9C=EB=94=A9=20=EC=98=A4=EB=A5=98=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../projects/developer/adapter/DevDetailProjectAdapter.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/feature/projects/src/main/java/com/zucchini/projects/developer/adapter/DevDetailProjectAdapter.kt b/feature/projects/src/main/java/com/zucchini/projects/developer/adapter/DevDetailProjectAdapter.kt index 4e46d90..162140a 100644 --- a/feature/projects/src/main/java/com/zucchini/projects/developer/adapter/DevDetailProjectAdapter.kt +++ b/feature/projects/src/main/java/com/zucchini/projects/developer/adapter/DevDetailProjectAdapter.kt @@ -6,8 +6,8 @@ import android.view.ViewGroup import androidx.core.content.ContextCompat.startActivity import androidx.recyclerview.widget.ListAdapter import androidx.recyclerview.widget.RecyclerView +import coil.load import com.zucchini.domain.model.ProjectInfoInDevDetailModel -import com.zucchini.feature.projects.R import com.zucchini.feature.projects.databinding.ItemDevDetailProjectsBinding import com.zucchini.projects.projects.ProjectDetailActivity import com.zucchini.view.ItemDiffCallback @@ -37,8 +37,9 @@ class DevDetailProjectAdapter : RecyclerView.ViewHolder(binding.root) { fun bind(projectList: ProjectInfoInDevDetailModel) { binding.run { - ivProjectProfile.setImageResource( - projectList.imageLink?.toIntOrNull() ?: R.drawable.developer_default_image, + ivProjectProfile.load( + projectList.imageLink + ?: com.zucchini.core.designsystem.R.drawable.project_profile_default, ) tvProjectName.text = projectList.name ?: "" tvProjectDescription.text = projectList.shortIntro ?: "" From 3cc2dcc0dee36157351fdc3c614db7f122e4204f Mon Sep 17 00:00:00 2001 From: kangyuri1114 Date: Wed, 5 Jun 2024 16:06:22 +0900 Subject: [PATCH 5/6] =?UTF-8?q?[fix]:=20=EB=94=94=EC=9E=90=EC=9D=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/zucchini/projects/projects/ProjectDetailActivity.kt | 3 +++ feature/projects/src/main/res/layout/item_projects.xml | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/feature/projects/src/main/java/com/zucchini/projects/projects/ProjectDetailActivity.kt b/feature/projects/src/main/java/com/zucchini/projects/projects/ProjectDetailActivity.kt index 4fcacf9..902546e 100644 --- a/feature/projects/src/main/java/com/zucchini/projects/projects/ProjectDetailActivity.kt +++ b/feature/projects/src/main/java/com/zucchini/projects/projects/ProjectDetailActivity.kt @@ -83,6 +83,9 @@ class ProjectDetailActivity : AppCompatActivity() { ?: getString(com.zucchini.feature.projects.R.string.github_default_link) tvGithub.paintFlags = Paint.UNDERLINE_TEXT_FLAG + tvAppLink.paintFlags = Paint.UNDERLINE_TEXT_FLAG + tvLandingLink.paintFlags = Paint.UNDERLINE_TEXT_FLAG + tvWebLink.paintFlags = Paint.UNDERLINE_TEXT_FLAG tvProjectName.text = it?.name tvProjectSorted.text = it?.category diff --git a/feature/projects/src/main/res/layout/item_projects.xml b/feature/projects/src/main/res/layout/item_projects.xml index 21b6a33..23ef3e4 100644 --- a/feature/projects/src/main/res/layout/item_projects.xml +++ b/feature/projects/src/main/res/layout/item_projects.xml @@ -10,7 +10,7 @@ Date: Sat, 8 Jun 2024 21:05:55 +0900 Subject: [PATCH 6/6] =?UTF-8?q?[fix]:=20=EB=A7=81=ED=81=AC=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/DevDetailProjectAdapter.kt | 4 +++- .../developer/adapter/DeveloperInfoAdapter.kt | 1 + .../projects/ProjectDetailActivity.kt | 22 +++++++++++++++---- .../projects/adapter/ProjectsAdapter.kt | 4 +++- .../src/main/res/layout/item_developer.xml | 22 +++++++++---------- .../res/layout/item_project_detail_dev.xml | 15 +++++++------ 6 files changed, 44 insertions(+), 24 deletions(-) diff --git a/feature/projects/src/main/java/com/zucchini/projects/developer/adapter/DevDetailProjectAdapter.kt b/feature/projects/src/main/java/com/zucchini/projects/developer/adapter/DevDetailProjectAdapter.kt index 162140a..cb07305 100644 --- a/feature/projects/src/main/java/com/zucchini/projects/developer/adapter/DevDetailProjectAdapter.kt +++ b/feature/projects/src/main/java/com/zucchini/projects/developer/adapter/DevDetailProjectAdapter.kt @@ -40,7 +40,9 @@ class DevDetailProjectAdapter : ivProjectProfile.load( projectList.imageLink ?: com.zucchini.core.designsystem.R.drawable.project_profile_default, - ) + ) { + size(120, 120) + } tvProjectName.text = projectList.name ?: "" tvProjectDescription.text = projectList.shortIntro ?: "" tvSortedProject.text = projectList.category ?: "" diff --git a/feature/projects/src/main/java/com/zucchini/projects/developer/adapter/DeveloperInfoAdapter.kt b/feature/projects/src/main/java/com/zucchini/projects/developer/adapter/DeveloperInfoAdapter.kt index 6e20cf8..93f141d 100644 --- a/feature/projects/src/main/java/com/zucchini/projects/developer/adapter/DeveloperInfoAdapter.kt +++ b/feature/projects/src/main/java/com/zucchini/projects/developer/adapter/DeveloperInfoAdapter.kt @@ -43,6 +43,7 @@ class DeveloperInfoAdapter : ) { crossfade(true) placeholder(com.zucchini.core.designsystem.R.drawable.project_profile_default) + size(60, 60) } tvDeveloperName.text = developersInfoInList.name tvDeveloperField.text = diff --git a/feature/projects/src/main/java/com/zucchini/projects/projects/ProjectDetailActivity.kt b/feature/projects/src/main/java/com/zucchini/projects/projects/ProjectDetailActivity.kt index 902546e..e0d9b88 100644 --- a/feature/projects/src/main/java/com/zucchini/projects/projects/ProjectDetailActivity.kt +++ b/feature/projects/src/main/java/com/zucchini/projects/projects/ProjectDetailActivity.kt @@ -78,7 +78,9 @@ class ProjectDetailActivity : AppCompatActivity() { ivProjectDetail.load( it?.imageLink ?: R.drawable.project_profile_default, - ) + ) { + size(180, 180) + } val projectGithubLink = it?.githubLink ?: getString(com.zucchini.feature.projects.R.string.github_default_link) @@ -93,9 +95,21 @@ class ProjectDetailActivity : AppCompatActivity() { tvProjectIntroContent.text = it?.shortIntro tvProjectIntroContentLong.text = it?.longIntro tvGithub.text = projectGithubLink - tvAppLink.text = it?.appLink ?: "아직 출시되지 않았어요!" - tvLandingLink.text = it?.infoPageLink ?: "준비 중입니다 :)" - tvWebLink.text = it?.webLink ?: "준비 중입니다 :)" + if (it?.appLink == "string") { + tvAppLink.text = "아직 출시되지 않았어요!" + } else { + tvAppLink.text = it?.appLink ?: "아직 출시되지 않았어요!" + } + if (it?.infoPageLink == "string") { + tvLandingLink.text = "준비 중입니다 :)" + } else { + tvWebLink.text = it?.webLink ?: "준비 중입니다 :)" + } + if (it?.webLink == "string") { + tvWebLink.text = "준비 중입니다 :)" + } else { + tvWebLink.text = it?.webLink ?: "준비 중입니다 :)" + } tvDevStackLanguage1.text = it?.languageList?.get(0) ?: "" tvDevStackLanguage2.text = it?.languageList?.get(1) ?: "" tvDevStackLanguage3.text = it?.languageList?.get(2) ?: "" diff --git a/feature/projects/src/main/java/com/zucchini/projects/projects/adapter/ProjectsAdapter.kt b/feature/projects/src/main/java/com/zucchini/projects/projects/adapter/ProjectsAdapter.kt index 6151883..37c8fb2 100644 --- a/feature/projects/src/main/java/com/zucchini/projects/projects/adapter/ProjectsAdapter.kt +++ b/feature/projects/src/main/java/com/zucchini/projects/projects/adapter/ProjectsAdapter.kt @@ -38,7 +38,9 @@ class ProjectsAdapter : ListAdapter @@ -47,18 +47,18 @@ @@ -66,14 +66,14 @@ android:id="@+id/tv_developer_clicked" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginTop="10dp" android:layout_marginEnd="10dp" android:layout_marginBottom="10dp" - app:layout_constraintTop_toBottomOf="@+id/tv_developer_github" - android:layout_marginTop="10dp" android:fontFamily="@font/pretendardmedium" android:textColor="@color/gray1" android:textSize="10sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toBottomOf="@+id/tv_developer_github" tools:text="조회수 +100" /> \ No newline at end of file diff --git a/feature/projects/src/main/res/layout/item_project_detail_dev.xml b/feature/projects/src/main/res/layout/item_project_detail_dev.xml index d263bff..9563d24 100644 --- a/feature/projects/src/main/res/layout/item_project_detail_dev.xml +++ b/feature/projects/src/main/res/layout/item_project_detail_dev.xml @@ -13,8 +13,8 @@ android:id="@+id/tv_developer_name" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginVertical="10dp" android:layout_marginHorizontal="10dp" + android:layout_marginVertical="15dp" android:fontFamily="@font/pretendardbold" android:textColor="@color/olive_black" android:textSize="10sp" @@ -27,11 +27,11 @@ + app:layout_constraintVertical_bias="0.5"> + app:layout_constraintTop_toTopOf="parent" + tools:text="안드로이드" /> + app:layout_constraintTop_toBottomOf="@+id/tv_developer_info1" + tools:text="안드로이드" /> \ No newline at end of file