From f3227f31e8298c699ed7c5abb2934a05dda91afd Mon Sep 17 00:00:00 2001 From: Nick9417 Date: Sun, 11 Jan 2026 23:28:49 +0900 Subject: [PATCH 1/4] =?UTF-8?q?=EC=9D=B4=EC=B2=B4=20=EA=B8=B0=EB=B3=B8=20L?= =?UTF-8?q?ayout?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/misc.xml | 1 - .../main/java/com/stable/scoi/MainActivity.kt | 22 ++ .../java/com/stable/scoi/di/RetrofitModule.kt | 4 +- .../java/com/stable/scoi/extention/String.kt | 4 + .../presentation/base/componant/ScoiButton.kt | 54 +++++ app/src/main/res/drawable/bithumb_logo.xml | 31 +++ app/src/main/res/drawable/ic_arrow_down.xml | 13 ++ app/src/main/res/drawable/ic_back.xml | 20 ++ app/src/main/res/drawable/ic_close_small.xml | 20 ++ app/src/main/res/drawable/ic_corporation.xml | 23 ++ app/src/main/res/drawable/ic_individual.xml | 23 ++ app/src/main/res/drawable/ic_mypage.xml | 20 ++ app/src/main/res/drawable/upbit_logo.xml | 16 ++ app/src/main/res/layout/activity_main.xml | 2 +- .../layout/fragment_exchange_bottomsheet.xml | 121 +++++++++++ .../fragment_reciever_type_bottomsheet.xml | 90 ++++++++ app/src/main/res/layout/fragment_transfer.xml | 201 ++++++++++++++++++ .../res/layout/fragment_transfer_amount.xml | 16 ++ 18 files changed, 677 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/com/stable/scoi/MainActivity.kt create mode 100644 app/src/main/java/com/stable/scoi/extention/String.kt create mode 100644 app/src/main/java/com/stable/scoi/presentation/base/componant/ScoiButton.kt create mode 100644 app/src/main/res/drawable/bithumb_logo.xml create mode 100644 app/src/main/res/drawable/ic_arrow_down.xml create mode 100644 app/src/main/res/drawable/ic_back.xml create mode 100644 app/src/main/res/drawable/ic_close_small.xml create mode 100644 app/src/main/res/drawable/ic_corporation.xml create mode 100644 app/src/main/res/drawable/ic_individual.xml create mode 100644 app/src/main/res/drawable/ic_mypage.xml create mode 100644 app/src/main/res/drawable/upbit_logo.xml create mode 100644 app/src/main/res/layout/fragment_exchange_bottomsheet.xml create mode 100644 app/src/main/res/layout/fragment_reciever_type_bottomsheet.xml create mode 100644 app/src/main/res/layout/fragment_transfer.xml create mode 100644 app/src/main/res/layout/fragment_transfer_amount.xml diff --git a/.idea/misc.xml b/.idea/misc.xml index 74dd639..b2c751a 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,3 @@ - diff --git a/app/src/main/java/com/stable/scoi/MainActivity.kt b/app/src/main/java/com/stable/scoi/MainActivity.kt new file mode 100644 index 0000000..8eb340f --- /dev/null +++ b/app/src/main/java/com/stable/scoi/MainActivity.kt @@ -0,0 +1,22 @@ +package com.stable.scoi + +import android.os.Bundle +import androidx.activity.enableEdgeToEdge +import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class MainActivity : AppCompatActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + enableEdgeToEdge() + setContentView(R.layout.activity_main) + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets -> + val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()) + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) + insets + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/stable/scoi/di/RetrofitModule.kt b/app/src/main/java/com/stable/scoi/di/RetrofitModule.kt index 0cc9c8e..adbdeb5 100644 --- a/app/src/main/java/com/stable/scoi/di/RetrofitModule.kt +++ b/app/src/main/java/com/stable/scoi/di/RetrofitModule.kt @@ -4,8 +4,8 @@ import android.util.Log import com.google.gson.GsonBuilder import com.google.gson.JsonParser import com.google.gson.JsonSyntaxException -import com.stable.scoi.extension.isJsonArray -import com.stable.scoi.extension.isJsonObject +import com.stable.scoi.extention.isJsonArray +import com.stable.scoi.extention.isJsonObject import dagger.Module import dagger.Provides import dagger.hilt.InstallIn diff --git a/app/src/main/java/com/stable/scoi/extention/String.kt b/app/src/main/java/com/stable/scoi/extention/String.kt new file mode 100644 index 0000000..35ef9e7 --- /dev/null +++ b/app/src/main/java/com/stable/scoi/extention/String.kt @@ -0,0 +1,4 @@ +package com.stable.scoi.extention + +fun String?.isJsonObject(): Boolean = this?.startsWith("{") == true && this.endsWith("}") +fun String?.isJsonArray(): Boolean = this?.startsWith("[") == true && this.endsWith("]") \ No newline at end of file diff --git a/app/src/main/java/com/stable/scoi/presentation/base/componant/ScoiButton.kt b/app/src/main/java/com/stable/scoi/presentation/base/componant/ScoiButton.kt new file mode 100644 index 0000000..31a1a5b --- /dev/null +++ b/app/src/main/java/com/stable/scoi/presentation/base/componant/ScoiButton.kt @@ -0,0 +1,54 @@ +package com.stable.scoi.presentation.base.componant + +import android.content.Context +import android.graphics.Color +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.FrameLayout +import android.widget.TextView +import com.google.android.material.card.MaterialCardView +import com.stable.scoi.R + +class ScoiButton @JvmOverloads constructor( + mContext: Context, + attrs: AttributeSet? = null, + defStyle: Int = 0 +) : FrameLayout(mContext, attrs, defStyle) { + + private val card: MaterialCardView + private val label: TextView + + init { + LayoutInflater.from(context).inflate(R.layout.custom_scoi_button, this, true) + card = findViewById(R.id.card) + label = findViewById(R.id.label) + + val a = context.obtainStyledAttributes(attrs, R.styleable.ScoiButton, defStyle, 0) + + try { + // 텍스트 + label.text = a.getString(R.styleable.ScoiButton_buttonText) ?: label.text + label.setTextColor( + a.getColor(R.styleable.ScoiButton_textColor, label.currentTextColor) + ) + label.setTextAppearance( + a.getResourceId(R.styleable.ScoiButton_textAppearance, R.style.l1m) + ) + + // 배경색 + card.setCardBackgroundColor( + a.getColor(R.styleable.ScoiButton_backgroundColor, resources.getColor(R.color.white)) + ) + + // 코너 + card.radius = a.getDimension(R.styleable.ScoiButton_cornerRadius, 60.toFloat()) + + // Border + card.strokeWidth = a.getDimensionPixelSize(R.styleable.ScoiButton_borderWidth, 0) + card.strokeColor = a.getColor(R.styleable.ScoiButton_borderColor, Color.TRANSPARENT) + + } finally { + a.recycle() + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/bithumb_logo.xml b/app/src/main/res/drawable/bithumb_logo.xml new file mode 100644 index 0000000..675acc7 --- /dev/null +++ b/app/src/main/res/drawable/bithumb_logo.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_arrow_down.xml b/app/src/main/res/drawable/ic_arrow_down.xml new file mode 100644 index 0000000..652bb02 --- /dev/null +++ b/app/src/main/res/drawable/ic_arrow_down.xml @@ -0,0 +1,13 @@ + + + diff --git a/app/src/main/res/drawable/ic_back.xml b/app/src/main/res/drawable/ic_back.xml new file mode 100644 index 0000000..e03d686 --- /dev/null +++ b/app/src/main/res/drawable/ic_back.xml @@ -0,0 +1,20 @@ + + + + diff --git a/app/src/main/res/drawable/ic_close_small.xml b/app/src/main/res/drawable/ic_close_small.xml new file mode 100644 index 0000000..9480435 --- /dev/null +++ b/app/src/main/res/drawable/ic_close_small.xml @@ -0,0 +1,20 @@ + + + + diff --git a/app/src/main/res/drawable/ic_corporation.xml b/app/src/main/res/drawable/ic_corporation.xml new file mode 100644 index 0000000..791f61f --- /dev/null +++ b/app/src/main/res/drawable/ic_corporation.xml @@ -0,0 +1,23 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_individual.xml b/app/src/main/res/drawable/ic_individual.xml new file mode 100644 index 0000000..c45e097 --- /dev/null +++ b/app/src/main/res/drawable/ic_individual.xml @@ -0,0 +1,23 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_mypage.xml b/app/src/main/res/drawable/ic_mypage.xml new file mode 100644 index 0000000..bd2892e --- /dev/null +++ b/app/src/main/res/drawable/ic_mypage.xml @@ -0,0 +1,20 @@ + + + + diff --git a/app/src/main/res/drawable/upbit_logo.xml b/app/src/main/res/drawable/upbit_logo.xml new file mode 100644 index 0000000..15a299f --- /dev/null +++ b/app/src/main/res/drawable/upbit_logo.xml @@ -0,0 +1,16 @@ + + + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 0e0f315..3756504 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -26,7 +26,7 @@ app:layout_constraintTop_toTopOf="parent"> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_reciever_type_bottomsheet.xml b/app/src/main/res/layout/fragment_reciever_type_bottomsheet.xml new file mode 100644 index 0000000..a36acf4 --- /dev/null +++ b/app/src/main/res/layout/fragment_reciever_type_bottomsheet.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_transfer.xml b/app/src/main/res/layout/fragment_transfer.xml new file mode 100644 index 0000000..37e0e88 --- /dev/null +++ b/app/src/main/res/layout/fragment_transfer.xml @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_transfer_amount.xml b/app/src/main/res/layout/fragment_transfer_amount.xml new file mode 100644 index 0000000..bd44cdf --- /dev/null +++ b/app/src/main/res/layout/fragment_transfer_amount.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file From 883b147776db0660d08d1a1f9445a78594eb9eeb Mon Sep 17 00:00:00 2001 From: Nick9417 Date: Wed, 14 Jan 2026 23:55:31 +0900 Subject: [PATCH 2/4] =?UTF-8?q?=EC=9D=B4=EC=B2=B4=20=EA=B8=B0=EB=B3=B8=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stable/scoi/presentation/MainActivity.kt | 8 +- .../scoi/presentation/base/BaseActivity.kt | 1 + .../scoi/presentation/base/BaseFragment.kt | 2 + .../stable/scoi/presentation/base/Exchange.kt | 7 + .../presentation/base/ExchangeBottomSheet.kt | 55 +++ .../stable/scoi/presentation/base/Reciever.kt | 14 + .../base/RecieverTypeBottomSheet.kt | 46 ++ .../base/TransferAmountFragment.kt | 17 + .../scoi/presentation/base/TransferEvent.kt | 6 + .../presentation/base/TransferFragment.kt | 108 +++++ .../scoi/presentation/base/TransferState.kt | 9 + .../presentation/base/TransferViewModel.kt | 82 ++++ app/src/main/res/layout/activity_main.xml | 11 - .../layout/fragment_exchange_bottomsheet.xml | 205 ++++----- .../fragment_reciever_type_bottomsheet.xml | 155 +++---- app/src/main/res/layout/fragment_transfer.xml | 399 +++++++++--------- .../res/layout/fragment_transfer_amount.xml | 31 +- app/src/main/res/navigation/main_graph.xml | 15 +- 18 files changed, 777 insertions(+), 394 deletions(-) create mode 100644 app/src/main/java/com/stable/scoi/presentation/base/Exchange.kt create mode 100644 app/src/main/java/com/stable/scoi/presentation/base/ExchangeBottomSheet.kt create mode 100644 app/src/main/java/com/stable/scoi/presentation/base/Reciever.kt create mode 100644 app/src/main/java/com/stable/scoi/presentation/base/RecieverTypeBottomSheet.kt create mode 100644 app/src/main/java/com/stable/scoi/presentation/base/TransferAmountFragment.kt create mode 100644 app/src/main/java/com/stable/scoi/presentation/base/TransferEvent.kt create mode 100644 app/src/main/java/com/stable/scoi/presentation/base/TransferFragment.kt create mode 100644 app/src/main/java/com/stable/scoi/presentation/base/TransferState.kt create mode 100644 app/src/main/java/com/stable/scoi/presentation/base/TransferViewModel.kt diff --git a/app/src/main/java/com/stable/scoi/presentation/MainActivity.kt b/app/src/main/java/com/stable/scoi/presentation/MainActivity.kt index 75d147e..6708126 100644 --- a/app/src/main/java/com/stable/scoi/presentation/MainActivity.kt +++ b/app/src/main/java/com/stable/scoi/presentation/MainActivity.kt @@ -1,11 +1,13 @@ package com.stable.scoi.presentation +import android.os.Bundle import androidx.activity.viewModels import androidx.navigation.NavController import androidx.navigation.fragment.NavHostFragment import com.stable.scoi.R import com.stable.scoi.databinding.ActivityMainBinding import com.stable.scoi.presentation.base.BaseActivity +import com.stable.scoi.presentation.base.TransferFragment import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch @@ -16,6 +18,7 @@ class MainActivity : BaseActivity - //changeBottomNavigationView(destination.id) - //TODO navController.navigate(R.id.calendarFragment) 이런식으로 navigation 이동 +// when (destination.id) { +// +// } } } } \ No newline at end of file diff --git a/app/src/main/java/com/stable/scoi/presentation/base/BaseActivity.kt b/app/src/main/java/com/stable/scoi/presentation/base/BaseActivity.kt index 3c6458f..15a78e4 100644 --- a/app/src/main/java/com/stable/scoi/presentation/base/BaseActivity.kt +++ b/app/src/main/java/com/stable/scoi/presentation/base/BaseActivity.kt @@ -8,6 +8,7 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle +import com.stable.scoi.R import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch diff --git a/app/src/main/java/com/stable/scoi/presentation/base/BaseFragment.kt b/app/src/main/java/com/stable/scoi/presentation/base/BaseFragment.kt index 7c36355..700259b 100644 --- a/app/src/main/java/com/stable/scoi/presentation/base/BaseFragment.kt +++ b/app/src/main/java/com/stable/scoi/presentation/base/BaseFragment.kt @@ -52,6 +52,8 @@ abstract class BaseFragment( + FragmentTransferAmountBinding::inflate +) { + override val viewModel: TransferViewModel by viewModels() + + override fun initView() { + + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/stable/scoi/presentation/base/TransferEvent.kt b/app/src/main/java/com/stable/scoi/presentation/base/TransferEvent.kt new file mode 100644 index 0000000..ec21d94 --- /dev/null +++ b/app/src/main/java/com/stable/scoi/presentation/base/TransferEvent.kt @@ -0,0 +1,6 @@ +package com.stable.scoi.presentation.base + +sealed class TransferEvent : UiEvent { + object Submit: TransferEvent() + object Cancel: TransferEvent() +} \ No newline at end of file diff --git a/app/src/main/java/com/stable/scoi/presentation/base/TransferFragment.kt b/app/src/main/java/com/stable/scoi/presentation/base/TransferFragment.kt new file mode 100644 index 0000000..90c04f5 --- /dev/null +++ b/app/src/main/java/com/stable/scoi/presentation/base/TransferFragment.kt @@ -0,0 +1,108 @@ +package com.stable.scoi.presentation.base + +import android.view.View +import androidx.fragment.app.activityViewModels +import androidx.fragment.app.viewModels +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleOwner +import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle +import androidx.lifecycle.viewModelScope +import androidx.navigation.fragment.findNavController +import com.stable.scoi.R +import com.stable.scoi.databinding.FragmentTransferBinding +import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch + +@AndroidEntryPoint +class TransferFragment : BaseFragment( + FragmentTransferBinding::inflate +) { + override val viewModel: TransferViewModel by viewModels() + + override fun initView() { + viewLifecycleOwner.lifecycleScope.launch { + viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { + viewModel.recieverType.collect { recieverType -> + when (recieverType) { + RecieverType.Null -> { + binding.TransferInputNameET.isFocusable = false + } + RecieverType.Individual -> { + binding.TransferInputNameET.isFocusable = true + binding.TransferInputNameET.isFocusableInTouchMode = true + binding.TransferInputNameET.requestFocus() + binding.TransferRecieverTypeTV.visibility = View.VISIBLE + binding.TransferRecieverTypeTV.text = "개인" + binding.TransferCorpNameENGET.visibility = View.GONE + binding.TransferCorpNameENGTV.visibility = View.GONE + binding.TransferCorpNameKORET.visibility = View.GONE + binding.TransferCorpNameKORTV.visibility = View.GONE + } + RecieverType.Corporation -> { + binding.TransferInputNameET.isFocusable = true + binding.TransferInputNameET.isFocusableInTouchMode = true + binding.TransferInputNameET.requestFocus() + binding.TransferRecieverTypeTV.visibility = View.VISIBLE + binding.TransferRecieverTypeTV.text = "법인" + binding.TransferCorpNameENGET.visibility = View.VISIBLE + binding.TransferCorpNameENGTV.visibility = View.VISIBLE + binding.TransferCorpNameKORET.visibility = View.VISIBLE + binding.TransferCorpNameKORTV.visibility = View.VISIBLE + } + } + } + } + } + + binding.TransferInputNameET.setOnClickListener { + viewModel.onRecieverTypeClicked() + } + + binding.TransferRecieverTypeTV.setOnClickListener { + viewModel.onRecieverTypeChange() + } + + binding.TransferInputExchangeET.isFocusable = false + binding.TransferInputExchangeET.setOnClickListener { + viewModel.onExchangeClicked() + } + + binding.TransferNextTV.setOnClickListener { + viewModel.onClickNextButton() + } + + viewModel.nextEvent.observe(viewLifecycleOwner) { nextEvent -> + when (nextEvent) { + TransferEvent.Submit -> { + findNavController().navigate(R.id.transfer_amount_fragment) + } + else -> Unit + } + } + + viewModel.recieverTypeEvent.observe(viewLifecycleOwner) { event -> + when (event) { + TransferEvent.Submit -> { + RecieverTypeBottomSheet().show( + parentFragmentManager, + "BottomSheet" + ) + } + else -> Unit + } + } + + viewModel.exchangeEvent.observe(viewLifecycleOwner) { exchangeEvent -> + when (exchangeEvent) { + TransferEvent.Submit -> { + ExchangeBottomSheet().show( + parentFragmentManager, + "BottomSheet" + ) + } + else -> Unit + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/stable/scoi/presentation/base/TransferState.kt b/app/src/main/java/com/stable/scoi/presentation/base/TransferState.kt new file mode 100644 index 0000000..7066fb9 --- /dev/null +++ b/app/src/main/java/com/stable/scoi/presentation/base/TransferState.kt @@ -0,0 +1,9 @@ +package com.stable.scoi.presentation.base + +data class TransferState( + val isLoading: Boolean = false +) : UiState + +val initialPageState = TransferState( + isLoading = false +) diff --git a/app/src/main/java/com/stable/scoi/presentation/base/TransferViewModel.kt b/app/src/main/java/com/stable/scoi/presentation/base/TransferViewModel.kt new file mode 100644 index 0000000..448d3d4 --- /dev/null +++ b/app/src/main/java/com/stable/scoi/presentation/base/TransferViewModel.kt @@ -0,0 +1,82 @@ +package com.stable.scoi.presentation.base + +import android.util.Log +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow + +class TransferViewModel : BaseViewModel(initialPageState) { + private val _recieverTypeEvent = MutableLiveData() + val recieverTypeEvent: LiveData = _recieverTypeEvent + + private val _exchangeEvent = MutableLiveData() + val exchangeEvent: LiveData = _exchangeEvent + + private val _exchangeType = MutableLiveData() + val exchangeType: LiveData = _exchangeType + + private val _nextEvent = MutableLiveData() + val nextEvent: LiveData = _nextEvent + + + private val _recieverType = MutableStateFlow(RecieverType.Null) + val recieverType = _recieverType.asStateFlow() + + + //Event + fun onRecieverTypeClicked() { //초기 recieverType 결정 + when (recieverType.value) { + RecieverType.Null -> { + _recieverTypeEvent.value = TransferEvent.Submit + } + else -> Unit + } + } + + fun onRecieverTypeChange() { //우측 recieverType 결정 메뉴 + _recieverTypeEvent.value = TransferEvent.Submit + } + + fun onExchangeClicked() { + _exchangeEvent.value = TransferEvent.Submit + } + + fun eventCancel() { + _recieverTypeEvent.value = TransferEvent.Cancel + _exchangeEvent.value = TransferEvent.Cancel + _nextEvent.value = TransferEvent.Cancel + } + + //RecieverType + fun setRecieverTypeIndividual() { + _recieverType.value = RecieverType.Individual + Log.d("recieverType", "indiv") + } + + fun setRecieverTypeCorporation() { + _recieverType.value = RecieverType.Corporation + Log.d("recieverType", "corp") + + } + + + //ExchangeType + fun setExchangeUpbit() { + _exchangeType.value = Exchange.Upbit + } + + fun setExchangeBithumb() { + _exchangeType.value = Exchange.Bithumb + } + + fun setExchangeBinance() { + _exchangeType.value = Exchange.Binance + } + + //NextButton + fun onClickNextButton() { + _nextEvent.value = TransferEvent.Submit + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 3756504..4f9abb2 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -26,17 +26,6 @@ app:layout_constraintTop_toTopOf="parent"> - diff --git a/app/src/main/res/layout/fragment_exchange_bottomsheet.xml b/app/src/main/res/layout/fragment_exchange_bottomsheet.xml index 7216eeb..9ab0fc3 100644 --- a/app/src/main/res/layout/fragment_exchange_bottomsheet.xml +++ b/app/src/main/res/layout/fragment_exchange_bottomsheet.xml @@ -1,121 +1,128 @@ - - - - - - + + + - + - - - - + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintStart_toStartOf="parent" + android:layout_marginTop="16dp" + android:layout_marginStart="16dp"/> + android:src="@drawable/ic_close_small" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toTopOf="parent" + android:layout_marginEnd="16dp" + android:layout_marginTop="16dp"/> - + app:layout_constraintTop_toBottomOf="@id/bottomsheet_exchange_tv" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" + android:layout_marginTop="20dp" + android:layout_marginStart="16dp" + android:layout_marginEnd="16dp" + android:padding="10dp"> - + - + - + - + app:layout_constraintTop_toBottomOf="@id/bottomsheet_exchange_upbit_ll" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" + android:layout_marginTop="14dp" + android:layout_marginStart="16dp" + android:layout_marginEnd="16dp" + android:padding="10dp"> + + + + + + + + + + + + - + - \ No newline at end of file + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_reciever_type_bottomsheet.xml b/app/src/main/res/layout/fragment_reciever_type_bottomsheet.xml index a36acf4..2dd3db6 100644 --- a/app/src/main/res/layout/fragment_reciever_type_bottomsheet.xml +++ b/app/src/main/res/layout/fragment_reciever_type_bottomsheet.xml @@ -1,90 +1,97 @@ - - + + + - - - - - + android:layout_height="match_parent"> + android:text="받는 분 유형" + android:textSize="22sp" + android:fontFamily="@font/pretendard_semibold" + android:textStyle="bold" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintStart_toStartOf="parent" + android:layout_marginTop="16dp" + android:layout_marginStart="16dp"/> - + - + - + - + + + + + app:layout_constraintTop_toBottomOf="@id/bottomsheet_recievertype_individual_ll" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintEnd_toEndOf="parent" + android:layout_marginTop="14dp" + android:layout_marginStart="16dp" + android:layout_marginEnd="16dp" + android:padding="10dp"> + + + + - + - \ No newline at end of file + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_transfer.xml b/app/src/main/res/layout/fragment_transfer.xml index 37e0e88..0b8780e 100644 --- a/app/src/main/res/layout/fragment_transfer.xml +++ b/app/src/main/res/layout/fragment_transfer.xml @@ -1,201 +1,210 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - \ No newline at end of file + android:layout_height="match_parent"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_transfer_amount.xml b/app/src/main/res/layout/fragment_transfer_amount.xml index bd44cdf..a7d220a 100644 --- a/app/src/main/res/layout/fragment_transfer_amount.xml +++ b/app/src/main/res/layout/fragment_transfer_amount.xml @@ -1,16 +1,23 @@ - - + + + - \ No newline at end of file + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/main_graph.xml b/app/src/main/res/navigation/main_graph.xml index f714a42..f248218 100644 --- a/app/src/main/res/navigation/main_graph.xml +++ b/app/src/main/res/navigation/main_graph.xml @@ -1,6 +1,19 @@ + android:id="@+id/main_graph" + app:startDestination="@id/tansfer_fragment"> + + + + + + \ No newline at end of file From 2a637294bcbb9801e2cc93a08c3d4963da785246 Mon Sep 17 00:00:00 2001 From: Nick9417 Date: Thu, 15 Jan 2026 21:23:39 +0900 Subject: [PATCH 3/4] =?UTF-8?q?=EC=9D=B4=EC=B2=B4=20=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?=EA=B8=B0=EB=B3=B8=20=EB=8F=99=EC=9E=91/=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/base/TransferFragment.kt | 37 ++++++++++--------- .../presentation/base/TransferViewModel.kt | 4 +- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/com/stable/scoi/presentation/base/TransferFragment.kt b/app/src/main/java/com/stable/scoi/presentation/base/TransferFragment.kt index 90c04f5..8f1b0bb 100644 --- a/app/src/main/java/com/stable/scoi/presentation/base/TransferFragment.kt +++ b/app/src/main/java/com/stable/scoi/presentation/base/TransferFragment.kt @@ -1,5 +1,6 @@ package com.stable.scoi.presentation.base +import android.util.Log import android.view.View import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels @@ -18,9 +19,26 @@ import kotlinx.coroutines.launch class TransferFragment : BaseFragment( FragmentTransferBinding::inflate ) { - override val viewModel: TransferViewModel by viewModels() + override val viewModel: TransferViewModel by activityViewModels() override fun initView() { + binding.TransferInputNameET.setOnClickListener { + viewModel.onRecieverTypeClicked() + } + + binding.TransferRecieverTypeTV.setOnClickListener { + viewModel.onRecieverTypeChange() + } + + binding.TransferInputExchangeET.isFocusable = false + binding.TransferInputExchangeET.setOnClickListener { + viewModel.onExchangeClicked() + } + + binding.TransferNextTV.setOnClickListener { + viewModel.onClickNextButton() + } + viewLifecycleOwner.lifecycleScope.launch { viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { viewModel.recieverType.collect { recieverType -> @@ -55,23 +73,6 @@ class TransferFragment : BaseFragment when (nextEvent) { TransferEvent.Submit -> { diff --git a/app/src/main/java/com/stable/scoi/presentation/base/TransferViewModel.kt b/app/src/main/java/com/stable/scoi/presentation/base/TransferViewModel.kt index 448d3d4..40ef06b 100644 --- a/app/src/main/java/com/stable/scoi/presentation/base/TransferViewModel.kt +++ b/app/src/main/java/com/stable/scoi/presentation/base/TransferViewModel.kt @@ -52,12 +52,12 @@ class TransferViewModel : BaseViewModel(initialPag //RecieverType fun setRecieverTypeIndividual() { _recieverType.value = RecieverType.Individual - Log.d("recieverType", "indiv") + Log.d("recieverType", recieverType.value.toString()) } fun setRecieverTypeCorporation() { _recieverType.value = RecieverType.Corporation - Log.d("recieverType", "corp") + Log.d("recieverType", recieverType.value.toString()) } From 1a0518532a0d9cd7514e78ea74e3ee577240db6f Mon Sep 17 00:00:00 2001 From: Nick9417 Date: Sat, 17 Jan 2026 19:55:41 +0900 Subject: [PATCH 4/4] =?UTF-8?q?=EC=9D=B4=EC=B2=B4=20=EA=B8=B0=EB=B3=B8=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EC=B6=94=EA=B0=80=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stable/scoi/presentation/base/Exchange.kt | 2 + .../stable/scoi/presentation/base/Receiver.kt | 14 + .../stable/scoi/presentation/base/Reciever.kt | 14 - .../scoi/presentation/base/TransferEvent.kt | 1 + .../presentation/base/TransferFragment.kt | 119 +++-- .../scoi/presentation/base/TransferState.kt | 3 - .../presentation/base/TransferViewModel.kt | 73 ++- app/src/main/res/layout/fragment_transfer.xml | 456 ++++++++++-------- 8 files changed, 420 insertions(+), 262 deletions(-) create mode 100644 app/src/main/java/com/stable/scoi/presentation/base/Receiver.kt delete mode 100644 app/src/main/java/com/stable/scoi/presentation/base/Reciever.kt diff --git a/app/src/main/java/com/stable/scoi/presentation/base/Exchange.kt b/app/src/main/java/com/stable/scoi/presentation/base/Exchange.kt index c96746c..fabcaba 100644 --- a/app/src/main/java/com/stable/scoi/presentation/base/Exchange.kt +++ b/app/src/main/java/com/stable/scoi/presentation/base/Exchange.kt @@ -4,4 +4,6 @@ sealed class Exchange { object Upbit: Exchange() object Bithumb: Exchange() object Binance: Exchange() + object Null: Exchange() + object Unselected: Exchange() } \ No newline at end of file diff --git a/app/src/main/java/com/stable/scoi/presentation/base/Receiver.kt b/app/src/main/java/com/stable/scoi/presentation/base/Receiver.kt new file mode 100644 index 0000000..e9010a6 --- /dev/null +++ b/app/src/main/java/com/stable/scoi/presentation/base/Receiver.kt @@ -0,0 +1,14 @@ +package com.stable.scoi.presentation.base + +data class Receiver( + var receiverName: String? = null, + var receiverAddress: String? = null, + var receiverType: ReceiverType = ReceiverType.Null +) + +sealed class ReceiverType { + object Individual: ReceiverType() + object Corporation: ReceiverType() + object Null: ReceiverType() +} + diff --git a/app/src/main/java/com/stable/scoi/presentation/base/Reciever.kt b/app/src/main/java/com/stable/scoi/presentation/base/Reciever.kt deleted file mode 100644 index f49499f..0000000 --- a/app/src/main/java/com/stable/scoi/presentation/base/Reciever.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.stable.scoi.presentation.base - -data class Reciever( - var recieverName: String = "", - var recieverType: RecieverType, - var adress: String = "" -) - -sealed class RecieverType { - object Individual: RecieverType() - object Corporation: RecieverType() - object Null: RecieverType() -} - diff --git a/app/src/main/java/com/stable/scoi/presentation/base/TransferEvent.kt b/app/src/main/java/com/stable/scoi/presentation/base/TransferEvent.kt index ec21d94..1078667 100644 --- a/app/src/main/java/com/stable/scoi/presentation/base/TransferEvent.kt +++ b/app/src/main/java/com/stable/scoi/presentation/base/TransferEvent.kt @@ -3,4 +3,5 @@ package com.stable.scoi.presentation.base sealed class TransferEvent : UiEvent { object Submit: TransferEvent() object Cancel: TransferEvent() + object Null: TransferEvent() } \ No newline at end of file diff --git a/app/src/main/java/com/stable/scoi/presentation/base/TransferFragment.kt b/app/src/main/java/com/stable/scoi/presentation/base/TransferFragment.kt index 8f1b0bb..b2a5766 100644 --- a/app/src/main/java/com/stable/scoi/presentation/base/TransferFragment.kt +++ b/app/src/main/java/com/stable/scoi/presentation/base/TransferFragment.kt @@ -2,6 +2,7 @@ package com.stable.scoi.presentation.base import android.util.Log import android.view.View +import androidx.core.content.ContextCompat import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import androidx.lifecycle.Lifecycle @@ -22,51 +23,83 @@ class TransferFragment : BaseFragment - when (recieverType) { - RecieverType.Null -> { - binding.TransferInputNameET.isFocusable = false + launch { + viewModel.receiverType.collect { receiverType -> + when (receiverType) { + ReceiverType.Null -> { + binding.TransferInputNameET.isFocusable = false + } + ReceiverType.Individual -> { + binding.TransferInputNameET.isFocusable = true + binding.TransferInputNameET.isFocusableInTouchMode = true + binding.TransferInputNameET.requestFocus() + binding.TransferReceiverTypeTV.visibility = View.VISIBLE + binding.TransferReceiverTypeTV.text = "개인" + binding.TransferCorpNameENGET.visibility = View.GONE + binding.TransferCorpNameENGTV.visibility = View.GONE + binding.TransferCorpNameKORET.visibility = View.GONE + binding.TransferCorpNameKORTV.visibility = View.GONE + } + ReceiverType.Corporation -> { + binding.TransferInputNameET.isFocusable = true + binding.TransferInputNameET.isFocusableInTouchMode = true + binding.TransferInputNameET.requestFocus() + binding.TransferReceiverTypeTV.visibility = View.VISIBLE + binding.TransferReceiverTypeTV.text = "법인" + binding.TransferCorpNameENGET.visibility = View.VISIBLE + binding.TransferCorpNameENGTV.visibility = View.VISIBLE + binding.TransferCorpNameKORET.visibility = View.VISIBLE + binding.TransferCorpNameKORTV.visibility = View.VISIBLE + } } - RecieverType.Individual -> { - binding.TransferInputNameET.isFocusable = true - binding.TransferInputNameET.isFocusableInTouchMode = true - binding.TransferInputNameET.requestFocus() - binding.TransferRecieverTypeTV.visibility = View.VISIBLE - binding.TransferRecieverTypeTV.text = "개인" - binding.TransferCorpNameENGET.visibility = View.GONE - binding.TransferCorpNameENGTV.visibility = View.GONE - binding.TransferCorpNameKORET.visibility = View.GONE - binding.TransferCorpNameKORTV.visibility = View.GONE + } + } + + launch { + viewModel.receiver.collect { receiver -> + if (receiver.receiverName == "") { + binding.TransferInputNameWarningTV.visibility = View.VISIBLE + } + else { + binding.TransferInputNameWarningTV.visibility = View.GONE + } + + if (receiver.receiverAddress == "") { + binding.TransferInputAddressWarningTV.visibility = View.VISIBLE } - RecieverType.Corporation -> { - binding.TransferInputNameET.isFocusable = true - binding.TransferInputNameET.isFocusableInTouchMode = true - binding.TransferInputNameET.requestFocus() - binding.TransferRecieverTypeTV.visibility = View.VISIBLE - binding.TransferRecieverTypeTV.text = "법인" - binding.TransferCorpNameENGET.visibility = View.VISIBLE - binding.TransferCorpNameENGTV.visibility = View.VISIBLE - binding.TransferCorpNameKORET.visibility = View.VISIBLE - binding.TransferCorpNameKORTV.visibility = View.VISIBLE + else { + binding.TransferInputAddressWarningTV.visibility = View.GONE } } } @@ -82,7 +115,7 @@ class TransferFragment : BaseFragment + viewModel.receiverTypeEvent.observe(viewLifecycleOwner) { event -> when (event) { TransferEvent.Submit -> { RecieverTypeBottomSheet().show( @@ -105,5 +138,35 @@ class TransferFragment : BaseFragment Unit } } + + viewModel.exchangeType.observe(viewLifecycleOwner) { exchange -> + when (exchange) { + Exchange.Upbit -> { + binding.TransferInputExchangeWarningTV.visibility = View.GONE + binding.TransferInputExchangeET.setText("업비트") + binding.TransferInputExchangeET.setTextColor( + ContextCompat.getColor(requireContext(), R.color.black) + ) + } + Exchange.Bithumb -> { + binding.TransferInputExchangeWarningTV.visibility = View.GONE + binding.TransferInputExchangeET.setText("빗썸") + binding.TransferInputExchangeET.setTextColor( + ContextCompat.getColor(requireContext(), R.color.black) + ) + } + Exchange.Binance -> { + binding.TransferInputExchangeWarningTV.visibility = View.GONE + binding.TransferInputExchangeET.setText("Binance") + binding.TransferInputExchangeET.setTextColor( + ContextCompat.getColor(requireContext(), R.color.black) + ) + } + Exchange.Unselected -> { + binding.TransferInputExchangeWarningTV.visibility = View.VISIBLE + } + else -> Unit + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/stable/scoi/presentation/base/TransferState.kt b/app/src/main/java/com/stable/scoi/presentation/base/TransferState.kt index 7066fb9..c917cb6 100644 --- a/app/src/main/java/com/stable/scoi/presentation/base/TransferState.kt +++ b/app/src/main/java/com/stable/scoi/presentation/base/TransferState.kt @@ -4,6 +4,3 @@ data class TransferState( val isLoading: Boolean = false ) : UiState -val initialPageState = TransferState( - isLoading = false -) diff --git a/app/src/main/java/com/stable/scoi/presentation/base/TransferViewModel.kt b/app/src/main/java/com/stable/scoi/presentation/base/TransferViewModel.kt index 40ef06b..a689de0 100644 --- a/app/src/main/java/com/stable/scoi/presentation/base/TransferViewModel.kt +++ b/app/src/main/java/com/stable/scoi/presentation/base/TransferViewModel.kt @@ -4,39 +4,60 @@ import android.util.Log import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import dagger.hilt.android.lifecycle.HiltViewModel +import jakarta.inject.Inject import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow -class TransferViewModel : BaseViewModel(initialPageState) { - private val _recieverTypeEvent = MutableLiveData() - val recieverTypeEvent: LiveData = _recieverTypeEvent +@HiltViewModel +class TransferViewModel @Inject constructor() : BaseViewModel( + TransferState() +) { + private val _receiverTypeEvent = MutableLiveData() + val receiverTypeEvent: LiveData = _receiverTypeEvent private val _exchangeEvent = MutableLiveData() val exchangeEvent: LiveData = _exchangeEvent - private val _exchangeType = MutableLiveData() + private val _exchangeType = MutableLiveData(Exchange.Null) val exchangeType: LiveData = _exchangeType private val _nextEvent = MutableLiveData() val nextEvent: LiveData = _nextEvent - private val _recieverType = MutableStateFlow(RecieverType.Null) - val recieverType = _recieverType.asStateFlow() + private val _receiverType = MutableStateFlow(ReceiverType.Null) + val receiverType = _receiverType.asStateFlow() + + private val _receiver = MutableStateFlow(Receiver()) + val receiver = _receiver.asStateFlow() //Event - fun onRecieverTypeClicked() { //초기 recieverType 결정 - when (recieverType.value) { - RecieverType.Null -> { - _recieverTypeEvent.value = TransferEvent.Submit + fun onReceiverTypeClicked() { //초기 receiverType 결정 + when (receiverType.value) { + ReceiverType.Null -> { + _receiverTypeEvent.value = TransferEvent.Submit } else -> Unit } } - fun onRecieverTypeChange() { //우측 recieverType 결정 메뉴 - _recieverTypeEvent.value = TransferEvent.Submit + + + + fun submitReceiver(receiverName: String, receiverAddress: String) { + _receiver.value = _receiver.value.copy( + receiverName, + receiverAddress, + _receiverType.value + ) + } + + + + + fun onReceiverTypeChange() { //우측 receiverType 결정 메뉴 + _receiverTypeEvent.value = TransferEvent.Submit } fun onExchangeClicked() { @@ -44,20 +65,20 @@ class TransferViewModel : BaseViewModel(initialPag } fun eventCancel() { - _recieverTypeEvent.value = TransferEvent.Cancel + _receiverTypeEvent.value = TransferEvent.Cancel _exchangeEvent.value = TransferEvent.Cancel _nextEvent.value = TransferEvent.Cancel } - //RecieverType + //ReceiverType fun setRecieverTypeIndividual() { - _recieverType.value = RecieverType.Individual - Log.d("recieverType", recieverType.value.toString()) + _receiverType.value = ReceiverType.Individual + Log.d("receiverType", receiverType.value.toString()) } fun setRecieverTypeCorporation() { - _recieverType.value = RecieverType.Corporation - Log.d("recieverType", recieverType.value.toString()) + _receiverType.value = ReceiverType.Corporation + Log.d("receiverType", receiverType.value.toString()) } @@ -66,17 +87,27 @@ class TransferViewModel : BaseViewModel(initialPag fun setExchangeUpbit() { _exchangeType.value = Exchange.Upbit } - fun setExchangeBithumb() { _exchangeType.value = Exchange.Bithumb } - fun setExchangeBinance() { _exchangeType.value = Exchange.Binance } + fun setExchange() { + _exchangeType.value = Exchange.Unselected + } //NextButton fun onClickNextButton() { - _nextEvent.value = TransferEvent.Submit + if(_receiver.value.receiverName == null || + _receiver.value.receiverName == "" || + _receiver.value.receiverAddress == null || + _receiver.value.receiverAddress == "" || + _exchangeType.value == Exchange.Null || + _receiverType.value == ReceiverType.Null + ) { + Unit + } + else _nextEvent.value = TransferEvent.Submit } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_transfer.xml b/app/src/main/res/layout/fragment_transfer.xml index 0b8780e..0e36e86 100644 --- a/app/src/main/res/layout/fragment_transfer.xml +++ b/app/src/main/res/layout/fragment_transfer.xml @@ -1,210 +1,274 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + android:layout_height="match_parent"> + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + \ No newline at end of file