diff --git a/app/src/main/java/com/c7z/mappilogue_aos/data/data/MyPageMenuItem.kt b/app/src/main/java/com/c7z/mappilogue_aos/data/data/MyPageMenuItem.kt new file mode 100644 index 0000000..8c687bd --- /dev/null +++ b/app/src/main/java/com/c7z/mappilogue_aos/data/data/MyPageMenuItem.kt @@ -0,0 +1,6 @@ +package com.c7z.mappilogue_aos.data.data + +data class MyPageMenuItem( + val icon : Int, + val title : String +) diff --git a/app/src/main/java/com/c7z/mappilogue_aos/data/remote/repository/UserRepositoryImpl.kt b/app/src/main/java/com/c7z/mappilogue_aos/data/remote/repository/UserRepositoryImpl.kt index dd0bb71..d8bd164 100644 --- a/app/src/main/java/com/c7z/mappilogue_aos/data/remote/repository/UserRepositoryImpl.kt +++ b/app/src/main/java/com/c7z/mappilogue_aos/data/remote/repository/UserRepositoryImpl.kt @@ -14,4 +14,8 @@ class UserRepositoryImpl @Inject constructor(private val source : UserSource): U override suspend fun requestModifyUserNickname(body: RequestModifyUserNickname): Result { return source.requestModifyUserNickname(body) } + + override suspend fun requestLogOut(): Result { + return source.requestLogOut() + } } \ No newline at end of file diff --git a/app/src/main/java/com/c7z/mappilogue_aos/data/remote/service/UserService.kt b/app/src/main/java/com/c7z/mappilogue_aos/data/remote/service/UserService.kt index b0c738c..9b8af6f 100644 --- a/app/src/main/java/com/c7z/mappilogue_aos/data/remote/service/UserService.kt +++ b/app/src/main/java/com/c7z/mappilogue_aos/data/remote/service/UserService.kt @@ -7,6 +7,7 @@ import retrofit2.Response import retrofit2.http.Body import retrofit2.http.GET import retrofit2.http.PATCH +import retrofit2.http.POST interface UserService { @GET("/api/v1/users/profile") @@ -16,4 +17,7 @@ interface UserService { suspend fun requestModifyUserNickname( @Body body : RequestModifyUserNickname ) : Response + + @POST("/api/v1/users/logout") + suspend fun requestLogOut() : Response } \ No newline at end of file diff --git a/app/src/main/java/com/c7z/mappilogue_aos/data/remote/source/UserRemoteSource.kt b/app/src/main/java/com/c7z/mappilogue_aos/data/remote/source/UserRemoteSource.kt index 073ac50..cc52c7a 100644 --- a/app/src/main/java/com/c7z/mappilogue_aos/data/remote/source/UserRemoteSource.kt +++ b/app/src/main/java/com/c7z/mappilogue_aos/data/remote/source/UserRemoteSource.kt @@ -23,4 +23,12 @@ class UserRemoteSource @Inject constructor(private val service : UserService): U else -> Result.failure(IllegalArgumentException(res.errorBody()?.convertAndGetCode().toString())) } } + + override suspend fun requestLogOut(): Result { + val res = service.requestLogOut() + return when(res.code()) { + in 200..399 -> Result.success(res.code()) + else -> Result.failure(IllegalArgumentException(res.errorBody()?.convertAndGetCode().toString())) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/c7z/mappilogue_aos/domain/repository/UserRepository.kt b/app/src/main/java/com/c7z/mappilogue_aos/domain/repository/UserRepository.kt index 3ce7da3..8d6a108 100644 --- a/app/src/main/java/com/c7z/mappilogue_aos/domain/repository/UserRepository.kt +++ b/app/src/main/java/com/c7z/mappilogue_aos/domain/repository/UserRepository.kt @@ -8,4 +8,6 @@ interface UserRepository { suspend fun requestUserProfileData() : Result suspend fun requestModifyUserNickname(body : RequestModifyUserNickname) : Result + + suspend fun requestLogOut() : Result } \ No newline at end of file diff --git a/app/src/main/java/com/c7z/mappilogue_aos/domain/source/UserSource.kt b/app/src/main/java/com/c7z/mappilogue_aos/domain/source/UserSource.kt index 7f4afb2..1a0bf1a 100644 --- a/app/src/main/java/com/c7z/mappilogue_aos/domain/source/UserSource.kt +++ b/app/src/main/java/com/c7z/mappilogue_aos/domain/source/UserSource.kt @@ -8,4 +8,6 @@ interface UserSource { suspend fun requestUserProfileData() : Result suspend fun requestModifyUserNickname(body : RequestModifyUserNickname) : Result + + suspend fun requestLogOut() : Result } \ No newline at end of file diff --git a/app/src/main/java/com/c7z/mappilogue_aos/presentation/ui/component/dialog/ComponentDialogTwoButton.kt b/app/src/main/java/com/c7z/mappilogue_aos/presentation/ui/component/dialog/ComponentDialogTwoButton.kt index eec2a96..5e40c69 100644 --- a/app/src/main/java/com/c7z/mappilogue_aos/presentation/ui/component/dialog/ComponentDialogTwoButton.kt +++ b/app/src/main/java/com/c7z/mappilogue_aos/presentation/ui/component/dialog/ComponentDialogTwoButton.kt @@ -29,7 +29,6 @@ class ComponentDialogTwoButton ( savedInstanceState: Bundle? ): View? { binding = DataBindingUtil.inflate(inflater, R.layout.component_dialog_2_button, container, false) - Log.e("----", "onCreateView: CREATE", ) initBinding() initUi() return binding.root @@ -48,6 +47,7 @@ class ComponentDialogTwoButton ( private fun initText() { when(tag) { "STOP_WRITING_TODO" -> case_STOP_WRITING_TODO() + "LOG_OUT" -> case_LOG_OUT() } } @@ -62,7 +62,8 @@ class ComponentDialogTwoButton ( private fun initSecondClick() { binding.componentDialog2ButtonTvSecondBtn.setOnClickListener { onSecondBtnClicked.invoke() - onDismiss() } + onDismiss() + } } private fun case_STOP_WRITING_TODO() { @@ -72,6 +73,12 @@ class ComponentDialogTwoButton ( binding.componentDialog2ButtonTvSecondBtn.text = "나가기" } + private fun case_LOG_OUT() { + binding.componentDialog2ButtonTvTitle.text = "로그아웃 할까요?" + binding.componentDialog2ButtonTvFirstBtn.text = "취소" + binding.componentDialog2ButtonTvSecondBtn.text = "확인" + } + fun onDismiss() { dismiss() } diff --git a/app/src/main/java/com/c7z/mappilogue_aos/presentation/ui/main/home/today/TodayFragment.kt b/app/src/main/java/com/c7z/mappilogue_aos/presentation/ui/main/home/today/TodayFragment.kt index d0bddfb..aa65c8a 100644 --- a/app/src/main/java/com/c7z/mappilogue_aos/presentation/ui/main/home/today/TodayFragment.kt +++ b/app/src/main/java/com/c7z/mappilogue_aos/presentation/ui/main/home/today/TodayFragment.kt @@ -16,6 +16,7 @@ import com.c7z.mappilogue_aos.presentation.ui.main.home.today.adapter.TodayMarke import com.c7z.mappilogue_aos.presentation.ui.main.home.today.adapter.TodayRecyclerViewAdapter import com.c7z.mappilogue_aos.presentation.ui.main.home.today.viewmodel.TodayViewModel import com.c7z.mappilogue_aos.presentation.util.DpToPxConverter +import com.c7z.mappilogue_aos.presentation.util.ItemDecorator class TodayFragment: Fragment(){ private lateinit var binding: FragmentTodayBinding @@ -66,26 +67,12 @@ class TodayFragment: Fragment(){ private fun initTodayRv() { binding.todayRv.adapter = todayAdapter - binding.todayRv.addItemDecoration(VerticalItemDecorator(DpToPxConverter.dpToPx(16f, requireContext()))) + binding.todayRv.addItemDecoration(ItemDecorator.VerticalItemDecorator(DpToPxConverter.dpToPx(16f, requireContext()))) } private fun initTodayMarkedRv() { binding.todayMarkedRv.setHasFixedSize(true) binding.todayMarkedRv.adapter = todayMarkedAdapter - binding.todayMarkedRv.addItemDecoration(HorizontalItemDecorator(DpToPxConverter.dpToPx(14f, requireContext()))) - } - - inner class VerticalItemDecorator(private var spacing: Int): RecyclerView.ItemDecoration() { - override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) { - super.getItemOffsets(outRect, view, parent, state) - if (parent.getChildAdapterPosition(view) != 0) outRect.top = spacing - } - } - - inner class HorizontalItemDecorator(private var spacing: Int): RecyclerView.ItemDecoration() { - override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) { - super.getItemOffsets(outRect, view, parent, state) - if (parent.getChildAdapterPosition(view) != 0) outRect.left = spacing - } + binding.todayMarkedRv.addItemDecoration(ItemDecorator.HorizontalItemDecorator(DpToPxConverter.dpToPx(14f, requireContext()))) } } \ No newline at end of file diff --git a/app/src/main/java/com/c7z/mappilogue_aos/presentation/ui/main/home/upcoming/UpcomingFragment.kt b/app/src/main/java/com/c7z/mappilogue_aos/presentation/ui/main/home/upcoming/UpcomingFragment.kt index 1344246..6340c53 100644 --- a/app/src/main/java/com/c7z/mappilogue_aos/presentation/ui/main/home/upcoming/UpcomingFragment.kt +++ b/app/src/main/java/com/c7z/mappilogue_aos/presentation/ui/main/home/upcoming/UpcomingFragment.kt @@ -18,6 +18,7 @@ import com.c7z.mappilogue_aos.presentation.ui.main.home.upcoming.adapter.Upcomin import com.c7z.mappilogue_aos.presentation.ui.main.home.upcoming.adapter.UpcomingRecyclerViewAdapter import com.c7z.mappilogue_aos.presentation.ui.main.home.upcoming.viewmodel.UpComingViewModel import com.c7z.mappilogue_aos.presentation.util.DpToPxConverter +import com.c7z.mappilogue_aos.presentation.util.ItemDecorator class UpcomingFragment: Fragment() { private lateinit var binding: FragmentUpcomingBinding @@ -70,30 +71,12 @@ class UpcomingFragment: Fragment() { private fun initUpcomingRv() { binding.upcomingRv.setHasFixedSize(true) binding.upcomingRv.adapter = todayAdapter - binding.upcomingRv.addItemDecoration(VerticalItemDecorator(DpToPxConverter.dpToPx(16f, requireContext()))) + binding.upcomingRv.addItemDecoration(ItemDecorator.VerticalItemDecorator(DpToPxConverter.dpToPx(16f, requireContext()))) } private fun initUpcomingMarkedRv() { binding.upcomingMarkedRv.setHasFixedSize(true) binding.upcomingMarkedRv.adapter = todayMarkedAdapter - binding.upcomingMarkedRv.addItemDecoration(HorizontalItemDecorator(DpToPxConverter.dpToPx(14f, requireContext()))) - } - - inner class VerticalItemDecorator(private var spacing: Int): RecyclerView.ItemDecoration() { - override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) { - super.getItemOffsets(outRect, view, parent, state) - if (parent.getChildAdapterPosition(view) != 0) outRect.top = spacing - } - } - - inner class HorizontalItemDecorator(private var spacing: Int): RecyclerView.ItemDecoration() { - override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) { - super.getItemOffsets(outRect, view, parent, state) - if (parent.getChildAdapterPosition(view) != 0) outRect.left = spacing - } - } - - private fun dpToPx(dp: Float, context: Context): Int { - return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, context.resources.displayMetrics).toInt() + binding.upcomingMarkedRv.addItemDecoration(ItemDecorator.HorizontalItemDecorator(DpToPxConverter.dpToPx(14f, requireContext()))) } } \ No newline at end of file diff --git a/app/src/main/java/com/c7z/mappilogue_aos/presentation/ui/main/mypage/MypageFragment.kt b/app/src/main/java/com/c7z/mappilogue_aos/presentation/ui/main/mypage/MypageFragment.kt index fa07d45..fbf621e 100644 --- a/app/src/main/java/com/c7z/mappilogue_aos/presentation/ui/main/mypage/MypageFragment.kt +++ b/app/src/main/java/com/c7z/mappilogue_aos/presentation/ui/main/mypage/MypageFragment.kt @@ -13,14 +13,20 @@ import androidx.fragment.app.viewModels import com.c7z.mappilogue_aos.R import com.c7z.mappilogue_aos.databinding.FragmentMypageBinding import com.c7z.mappilogue_aos.presentation.ui.change_profile.ChangeProfileActivity +import com.c7z.mappilogue_aos.presentation.ui.component.dialog.ComponentDialogTwoButton +import com.c7z.mappilogue_aos.presentation.ui.main.mypage.adapter.MyPageMenuAdapter import com.c7z.mappilogue_aos.presentation.ui.main.mypage.viewmodel.MypageViewModel +import com.c7z.mappilogue_aos.presentation.ui.signin.SignInActivity +import com.c7z.mappilogue_aos.presentation.util.ItemDecorator +import com.kakao.sdk.user.UserApiClient import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint class MypageFragment : Fragment() { private lateinit var binding : FragmentMypageBinding private val viewModel: MypageViewModel by viewModels() - + private val upperMenuAdapter by lazy { MyPageMenuAdapter(viewModel.upperMenuData(), ::onUpperMenuClicked) } + private val lowerMenuAdapter by lazy { MyPageMenuAdapter(viewModel.lowerMenuData(), ::onLowerMenuClicked) } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -28,6 +34,7 @@ class MypageFragment : Fragment() { binding = DataBindingUtil.inflate(inflater, R.layout.fragment_mypage, container, false) initBinding() + initUi() initObserve() return binding.root @@ -39,9 +46,26 @@ class MypageFragment : Fragment() { binding.lifecycleOwner = this } + private fun initUi() { + initUpperRv() + initLowerRv() + } + private fun initObserve() { - viewModel.userProfileData.observe(viewLifecycleOwner) { - Log.e("----", "initObserve: $it", ) + observeLogOut() + } + + private fun initUpperRv() { + binding.fgMyRvUpperMenu.apply { + adapter = upperMenuAdapter + addItemDecoration(ItemDecorator.MyPageItemDecorator(requireActivity())) + } + } + + private fun initLowerRv() { + binding.fgMyRvLowerMenu.apply { + adapter = lowerMenuAdapter + addItemDecoration(ItemDecorator.MyPageItemDecorator(requireActivity())) } } @@ -49,4 +73,40 @@ class MypageFragment : Fragment() { startActivity(Intent(requireActivity(), ChangeProfileActivity::class.java)) } + private fun onUpperMenuClicked(position : Int) { + + } + + private fun onLowerMenuClicked(position : Int) { + when(position) { + 0 -> onLogoutClicked() + 1 -> onSignOutClicked() + } + } + + private fun onLogoutClicked() { + ComponentDialogTwoButton(::requestLogOut, "GREEN").show(requireActivity().supportFragmentManager, "LOG_OUT") + } + + private fun requestLogOut() { + viewModel.requestLogOut() + } + + private fun observeLogOut() { + viewModel.logOutStatus.observe(viewLifecycleOwner) { + if(it == 200) { + socialLogOut() + startActivity(Intent(requireActivity(), SignInActivity::class.java)).also { requireActivity().finish() } + } + } + } + + private fun onSignOutClicked() { + + } + + private fun socialLogOut() { + UserApiClient.instance.logout { } + } + } \ No newline at end of file diff --git a/app/src/main/java/com/c7z/mappilogue_aos/presentation/ui/main/mypage/adapter/MyPageMenuAdapter.kt b/app/src/main/java/com/c7z/mappilogue_aos/presentation/ui/main/mypage/adapter/MyPageMenuAdapter.kt new file mode 100644 index 0000000..bf3a868 --- /dev/null +++ b/app/src/main/java/com/c7z/mappilogue_aos/presentation/ui/main/mypage/adapter/MyPageMenuAdapter.kt @@ -0,0 +1,37 @@ +package com.c7z.mappilogue_aos.presentation.ui.main.mypage.adapter + +import android.view.LayoutInflater +import android.view.MenuItem +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.c7z.mappilogue_aos.data.data.MyPageMenuItem +import com.c7z.mappilogue_aos.databinding.ItemRvMyPageMenuBinding + +class MyPageMenuAdapter( + private val menuItems: List, + private val onItemClicked: (Int) -> Unit +) : RecyclerView.Adapter() { + inner class MyPageMenuViewHolder(private val binding: ItemRvMyPageMenuBinding) : + RecyclerView.ViewHolder(binding.root) { + fun bind(item: MyPageMenuItem) { + binding.data = item + binding.root.setOnClickListener { onItemClicked.invoke(absoluteAdapterPosition) } + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyPageMenuViewHolder { + return MyPageMenuViewHolder( + ItemRvMyPageMenuBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + } + + override fun getItemCount(): Int = menuItems.size + + override fun onBindViewHolder(holder: MyPageMenuViewHolder, position: Int) { + holder.bind(menuItems[position]) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/c7z/mappilogue_aos/presentation/ui/main/mypage/viewmodel/MypageViewModel.kt b/app/src/main/java/com/c7z/mappilogue_aos/presentation/ui/main/mypage/viewmodel/MypageViewModel.kt index bb633da..1777646 100644 --- a/app/src/main/java/com/c7z/mappilogue_aos/presentation/ui/main/mypage/viewmodel/MypageViewModel.kt +++ b/app/src/main/java/com/c7z/mappilogue_aos/presentation/ui/main/mypage/viewmodel/MypageViewModel.kt @@ -5,6 +5,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.c7z.mappilogue_aos.R +import com.c7z.mappilogue_aos.data.data.MyPageMenuItem import com.c7z.mappilogue_aos.data.remote.response.ResponseUserProfileData import com.c7z.mappilogue_aos.domain.repository.UserRepository import dagger.hilt.android.lifecycle.HiltViewModel @@ -17,6 +18,9 @@ class MypageViewModel @Inject constructor(private val userRepository: UserReposi private val _userProfileData = MutableLiveData() val userProfileData : LiveData = _userProfileData + private val _logOutStatus = MutableLiveData() + val logOutStatus : LiveData = _logOutStatus + init { requestUserProfile() } @@ -28,7 +32,26 @@ class MypageViewModel @Inject constructor(private val userRepository: UserReposi } } + fun requestLogOut() { + viewModelScope.launch { + userRepository.requestLogOut() + .onSuccess { _logOutStatus.value = it } + } + } + private fun ResponseUserProfileData.ResultUserProfileData.setImage() : ResponseUserProfileData.ResultUserProfileData { return this.apply { this.profileImageUrl = R.drawable.ic_default_profile.toString() } } + + /** Dummy **/ + fun upperMenuData() : List = listOf( + MyPageMenuItem(R.drawable.ic_my_page_set_alarm, "알림 설정"), + MyPageMenuItem(R.drawable.ic_my_page_show_term, "이용약관"), + MyPageMenuItem(R.drawable.ic_my_page_send_report, "문의하기") + ) + + fun lowerMenuData() : List = listOf( + MyPageMenuItem(R.drawable.ic_my_page_log_out, "로그아웃"), + MyPageMenuItem(R.drawable.ic_my_page_sign_out, "탈퇴하기") + ) } \ No newline at end of file diff --git a/app/src/main/java/com/c7z/mappilogue_aos/presentation/util/ItemDecorator.kt b/app/src/main/java/com/c7z/mappilogue_aos/presentation/util/ItemDecorator.kt new file mode 100644 index 0000000..aa4213c --- /dev/null +++ b/app/src/main/java/com/c7z/mappilogue_aos/presentation/util/ItemDecorator.kt @@ -0,0 +1,46 @@ +package com.c7z.mappilogue_aos.presentation.util + +import android.content.Context +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.Paint +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.DividerItemDecoration +import androidx.recyclerview.widget.RecyclerView +import com.c7z.mappilogue_aos.R + +object ItemDecorator { + + class VerticalItemDecorator(private var spacing: Int): RecyclerView.ItemDecoration() { + override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) { + super.getItemOffsets(outRect, view, parent, state) + if (parent.getChildAdapterPosition(view) != 0) outRect.top = spacing + } + } + + class HorizontalItemDecorator(private var spacing: Int): RecyclerView.ItemDecoration() { + override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) { + super.getItemOffsets(outRect, view, parent, state) + if (parent.getChildAdapterPosition(view) != 0) outRect.left = spacing + } + } + + class MyPageItemDecorator(private val context : Context) : RecyclerView.ItemDecoration() { + override fun onDrawOver(c: Canvas, parent: RecyclerView, state: RecyclerView.State) { + super.onDrawOver(c, parent, state) + val height = DpToPxConverter.dpToPx(1f, context) + + val left = parent.paddingLeft.toFloat() + val right = parent.width - parent.paddingRight.toFloat() + val paint = Paint().apply { color = context.resources.getColor(R.color.gray_2, null) } + for(i in 0 until parent.childCount) { + val view = parent.getChildAt(i) + val top = view.bottom.toFloat() + (view.layoutParams as RecyclerView.LayoutParams).bottomMargin + val bottom = top + height + + c.drawRect(left, top, right, bottom, paint) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_my_page_log_out.xml b/app/src/main/res/drawable/ic_my_page_log_out.xml new file mode 100644 index 0000000..1551324 --- /dev/null +++ b/app/src/main/res/drawable/ic_my_page_log_out.xml @@ -0,0 +1,27 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_my_page_send_report.xml b/app/src/main/res/drawable/ic_my_page_send_report.xml new file mode 100644 index 0000000..7d174a9 --- /dev/null +++ b/app/src/main/res/drawable/ic_my_page_send_report.xml @@ -0,0 +1,21 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_my_page_set_alarm.xml b/app/src/main/res/drawable/ic_my_page_set_alarm.xml new file mode 100644 index 0000000..5484c92 --- /dev/null +++ b/app/src/main/res/drawable/ic_my_page_set_alarm.xml @@ -0,0 +1,20 @@ + + + + diff --git a/app/src/main/res/drawable/ic_my_page_show_term.xml b/app/src/main/res/drawable/ic_my_page_show_term.xml new file mode 100644 index 0000000..461ef51 --- /dev/null +++ b/app/src/main/res/drawable/ic_my_page_show_term.xml @@ -0,0 +1,31 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_my_page_sign_out.xml b/app/src/main/res/drawable/ic_my_page_sign_out.xml new file mode 100644 index 0000000..22c01aa --- /dev/null +++ b/app/src/main/res/drawable/ic_my_page_sign_out.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/app/src/main/res/layout/fragment_mypage.xml b/app/src/main/res/layout/fragment_mypage.xml index 6f273e0..c19cb8f 100644 --- a/app/src/main/res/layout/fragment_mypage.xml +++ b/app/src/main/res/layout/fragment_mypage.xml @@ -86,7 +86,18 @@ app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent" /> + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_rv_my_page_menu.xml b/app/src/main/res/layout/item_rv_my_page_menu.xml new file mode 100644 index 0000000..b3ba5da --- /dev/null +++ b/app/src/main/res/layout/item_rv_my_page_menu.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ec8344e..9771eb2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -9,6 +9,7 @@ 확인 취소 닉네임 + 업데이트