From 5570a92c53700ace43f8619aafdac68f3d0c7f39 Mon Sep 17 00:00:00 2001 From: Guixin Zhu Date: Fri, 5 Oct 2018 20:52:37 +0900 Subject: [PATCH] use view model factory to create the OrderInputViewModel --- .../ui/orderinput/OrderInputFragment.kt | 23 +++++++++++---- .../ui/orderinput/OrderInputViewModel.kt | 28 +++++++++---------- 2 files changed, 32 insertions(+), 19 deletions(-) diff --git a/exampleAppJapan/src/main/kotlin/it/trade/android/japanapp/ui/orderinput/OrderInputFragment.kt b/exampleAppJapan/src/main/kotlin/it/trade/android/japanapp/ui/orderinput/OrderInputFragment.kt index 0a509ca..2eb2781 100644 --- a/exampleAppJapan/src/main/kotlin/it/trade/android/japanapp/ui/orderinput/OrderInputFragment.kt +++ b/exampleAppJapan/src/main/kotlin/it/trade/android/japanapp/ui/orderinput/OrderInputFragment.kt @@ -5,9 +5,12 @@ import android.arch.lifecycle.ViewModelProviders import android.opengl.Visibility import android.os.Bundle import android.support.v4.app.Fragment +import android.text.Editable +import android.text.TextWatcher import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.EditText import it.trade.android.japanapp.R import kotlinx.android.synthetic.main.order_input_fragment.* import kotlinx.android.synthetic.main.order_input_fragment.view.* @@ -15,7 +18,6 @@ import kotlinx.android.synthetic.main.order_input_fragment.view.* class OrderInputFragment : Fragment() { companion object { - fun newInstance() = OrderInputFragment() fun newInstance(symbol: String): OrderInputFragment { val args = Bundle() args.putString("symbol", symbol) @@ -26,18 +28,17 @@ class OrderInputFragment : Fragment() { } private lateinit var viewModel: OrderInputViewModel + private lateinit var symbol: String override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { + symbol = arguments?.getString("symbol") ?: "8703" return inflater.inflate(R.layout.order_input_fragment, container, false) } override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) - viewModel = ViewModelProviders.of(activity!!).get(OrderInputViewModel::class.java) - arguments?.getString("symbol")?.let { - viewModel.init(it) - } + viewModel = ViewModelProviders.of(activity!!, OrderInputViewModelFactory(symbol)).get(OrderInputViewModel::class.java) viewModel.getOrderModel().observe(this, Observer { orderForm -> orderForm?.run { tvSymbolName.text = symbol.name @@ -96,4 +97,16 @@ class OrderInputFragment : Fragment() { } } + fun EditText.onChange(cb: (String) -> Unit) { + this.addTextChangedListener(object : TextWatcher { + override fun afterTextChanged(s: Editable?) { + cb(s.toString()) + } + + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {} + }) + } + } diff --git a/exampleAppJapan/src/main/kotlin/it/trade/android/japanapp/ui/orderinput/OrderInputViewModel.kt b/exampleAppJapan/src/main/kotlin/it/trade/android/japanapp/ui/orderinput/OrderInputViewModel.kt index 22056b4..48323e4 100644 --- a/exampleAppJapan/src/main/kotlin/it/trade/android/japanapp/ui/orderinput/OrderInputViewModel.kt +++ b/exampleAppJapan/src/main/kotlin/it/trade/android/japanapp/ui/orderinput/OrderInputViewModel.kt @@ -3,15 +3,20 @@ package it.trade.android.japanapp.ui.orderinput import android.arch.lifecycle.LiveData import android.arch.lifecycle.MutableLiveData import android.arch.lifecycle.ViewModel +import android.arch.lifecycle.ViewModelProvider +import android.util.Log -class OrderInputViewModel : ViewModel() { +private const val TAG = "OrderInputViewModel" + +class OrderInputViewModel(private val symbol: String) : ViewModel() { private lateinit var orderForm: MutableLiveData fun getOrderModel(): LiveData { if (!this::orderForm.isInitialized) { + Log.d(TAG, "initialized.") orderForm = MutableLiveData() orderForm.value = OrderForm( - TradeItSDKHolder.getSymbolProvider().getJapanSymbol("8703"), + TradeItSDKHolder.getSymbolProvider().getJapanSymbol(symbol), TradeItSDKHolder.getBuyingPower()) } return orderForm @@ -49,18 +54,6 @@ class OrderInputViewModel : ViewModel() { } } - fun init(symbol: String?) { - // TODO need a cleaner way to initialize the OrderForm - if (symbol != null) { - if (!this::orderForm.isInitialized || (this::orderForm.isInitialized && symbol != orderForm.value?.symbol?.symbol)) { - orderForm = MutableLiveData() - orderForm.value = OrderForm( - TradeItSDKHolder.getSymbolProvider().getJapanSymbol(symbol), - TradeItSDKHolder.getBuyingPower()) - } - } - } - fun setMarketOrder() { orderForm.value = orderForm.value?.apply { orderInfo = orderInfo.copy(type = OrderType.MARKET, limitPrice = symbol.price) @@ -74,6 +67,13 @@ class OrderInputViewModel : ViewModel() { } } +class OrderInputViewModelFactory(private val symbol: String) : ViewModelProvider.NewInstanceFactory() { + override fun create(modelClass: Class): T { + return OrderInputViewModel(symbol) as T + } + +} + class OrderForm(val symbol: JapanSymbol, val buyingPower: BuyingPower) { var orderInfo: OrderInfo = OrderInfo( quantity = symbol.lotSize,