Skip to content

Commit 45765f2

Browse files
committed
use view model factory to create the OrderInputViewModel
1 parent f27283a commit 45765f2

File tree

2 files changed

+33
-19
lines changed

2 files changed

+33
-19
lines changed

exampleAppJapan/src/main/kotlin/it/trade/android/japanapp/ui/orderinput/OrderInputFragment.kt

+18-5
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,19 @@ import android.arch.lifecycle.ViewModelProviders
55
import android.opengl.Visibility
66
import android.os.Bundle
77
import android.support.v4.app.Fragment
8+
import android.text.Editable
9+
import android.text.TextWatcher
810
import android.view.LayoutInflater
911
import android.view.View
1012
import android.view.ViewGroup
13+
import android.widget.EditText
1114
import it.trade.android.japanapp.R
1215
import kotlinx.android.synthetic.main.order_input_fragment.*
1316
import kotlinx.android.synthetic.main.order_input_fragment.view.*
1417

1518
class OrderInputFragment : Fragment() {
1619

1720
companion object {
18-
fun newInstance() = OrderInputFragment()
1921
fun newInstance(symbol: String): OrderInputFragment {
2022
val args = Bundle()
2123
args.putString("symbol", symbol)
@@ -26,18 +28,17 @@ class OrderInputFragment : Fragment() {
2628
}
2729

2830
private lateinit var viewModel: OrderInputViewModel
31+
private lateinit var symbol: String
2932

3033
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
3134
savedInstanceState: Bundle?): View {
35+
symbol = arguments?.getString("symbol") ?: "8703"
3236
return inflater.inflate(R.layout.order_input_fragment, container, false)
3337
}
3438

3539
override fun onActivityCreated(savedInstanceState: Bundle?) {
3640
super.onActivityCreated(savedInstanceState)
37-
viewModel = ViewModelProviders.of(activity!!).get(OrderInputViewModel::class.java)
38-
arguments?.getString("symbol")?.let {
39-
viewModel.init(it)
40-
}
41+
viewModel = ViewModelProviders.of(activity!!, OrderInputViewModelFactory(symbol)).get(OrderInputViewModel::class.java)
4142
viewModel.getOrderModel().observe(this, Observer { orderForm ->
4243
orderForm?.run {
4344
tvSymbolName.text = symbol.name
@@ -96,4 +97,16 @@ class OrderInputFragment : Fragment() {
9697
}
9798
}
9899

100+
fun EditText.onChange(cb: (String) -> Unit) {
101+
this.addTextChangedListener(object : TextWatcher {
102+
override fun afterTextChanged(s: Editable?) {
103+
cb(s.toString())
104+
}
105+
106+
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
107+
108+
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
109+
})
110+
}
111+
99112
}

exampleAppJapan/src/main/kotlin/it/trade/android/japanapp/ui/orderinput/OrderInputViewModel.kt

+15-14
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,20 @@ package it.trade.android.japanapp.ui.orderinput
33
import android.arch.lifecycle.LiveData
44
import android.arch.lifecycle.MutableLiveData
55
import android.arch.lifecycle.ViewModel
6+
import android.arch.lifecycle.ViewModelProvider
7+
import android.util.Log
68

7-
class OrderInputViewModel : ViewModel() {
9+
private const val TAG = "OrderInputViewModel"
10+
11+
class OrderInputViewModel(private val symbol: String) : ViewModel() {
812
private lateinit var orderForm: MutableLiveData<OrderForm>
913

1014
fun getOrderModel(): LiveData<OrderForm> {
1115
if (!this::orderForm.isInitialized) {
16+
Log.d(TAG, "initialized.")
1217
orderForm = MutableLiveData()
1318
orderForm.value = OrderForm(
14-
TradeItSDKHolder.getSymbolProvider().getJapanSymbol("8703"),
19+
TradeItSDKHolder.getSymbolProvider().getJapanSymbol(symbol),
1520
TradeItSDKHolder.getBuyingPower())
1621
}
1722
return orderForm
@@ -49,18 +54,6 @@ class OrderInputViewModel : ViewModel() {
4954
}
5055
}
5156

52-
fun init(symbol: String?) {
53-
// TODO need a cleaner way to initialize the OrderForm
54-
if (symbol != null) {
55-
if (!this::orderForm.isInitialized || (this::orderForm.isInitialized && symbol != orderForm.value?.symbol?.symbol)) {
56-
orderForm = MutableLiveData()
57-
orderForm.value = OrderForm(
58-
TradeItSDKHolder.getSymbolProvider().getJapanSymbol(symbol),
59-
TradeItSDKHolder.getBuyingPower())
60-
}
61-
}
62-
}
63-
6457
fun setMarketOrder() {
6558
orderForm.value = orderForm.value?.apply {
6659
orderInfo = orderInfo.copy(type = OrderType.MARKET, limitPrice = symbol.price)
@@ -74,6 +67,14 @@ class OrderInputViewModel : ViewModel() {
7467
}
7568
}
7669

70+
class OrderInputViewModelFactory(private val symbol: String) : ViewModelProvider.NewInstanceFactory() {
71+
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
72+
@Suppress("UNCHECKED_CAST")
73+
return OrderInputViewModel(symbol) as T
74+
}
75+
76+
}
77+
7778
class OrderForm(val symbol: JapanSymbol, val buyingPower: BuyingPower) {
7879
var orderInfo: OrderInfo = OrderInfo(
7980
quantity = symbol.lotSize,

0 commit comments

Comments
 (0)