@@ -3,17 +3,14 @@ package org.wordpress.android.ui.sitecreation.domains
3
3
import android.content.Context
4
4
import android.os.Bundle
5
5
import android.view.ViewGroup
6
- import androidx.annotation.LayoutRes
7
6
import androidx.appcompat.app.AppCompatActivity
8
- import androidx.appcompat.widget.AppCompatButton
9
- import androidx.fragment.app.FragmentActivity
10
- import androidx.lifecycle.Observer
11
7
import androidx.lifecycle.ViewModelProvider
12
8
import androidx.recyclerview.widget.LinearLayoutManager
13
9
import androidx.recyclerview.widget.RecyclerView
14
- import kotlinx.android.synthetic.main.site_creation_domains_screen.*
15
10
import org.wordpress.android.R
16
11
import org.wordpress.android.WordPress
12
+ import org.wordpress.android.databinding.SiteCreationDomainsScreenBinding
13
+ import org.wordpress.android.databinding.SiteCreationFormScreenBinding
17
14
import org.wordpress.android.ui.accounts.HelpActivity
18
15
import org.wordpress.android.ui.sitecreation.SiteCreationBaseFormFragment
19
16
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsUiState.DomainsUiContentState
@@ -23,15 +20,17 @@ import org.wordpress.android.ui.utils.UiHelpers
23
20
import org.wordpress.android.util.DisplayUtilsWrapper
24
21
import javax.inject.Inject
25
22
23
+ @Suppress(" TooManyFunctions" )
26
24
class SiteCreationDomainsFragment : SiteCreationBaseFormFragment () {
27
- private lateinit var nonNullActivity: FragmentActivity
28
25
private var searchInputWithHeader: SearchInputWithHeader ? = null
29
26
private lateinit var viewModel: SiteCreationDomainsViewModel
30
27
31
28
@Inject internal lateinit var viewModelFactory: ViewModelProvider .Factory
32
29
@Inject internal lateinit var uiHelpers: UiHelpers
33
30
@Inject internal lateinit var displayUtils: DisplayUtilsWrapper
34
31
32
+ private var binding: SiteCreationDomainsScreenBinding ? = null
33
+
35
34
override fun onAttach (context : Context ) {
36
35
super .onAttach(context)
37
36
if (context !is DomainsScreenListener ) {
@@ -42,99 +41,104 @@ class SiteCreationDomainsFragment : SiteCreationBaseFormFragment() {
42
41
}
43
42
}
44
43
45
- @LayoutRes
46
- override fun getContentLayout (): Int {
47
- return R .layout.site_creation_domains_screen
44
+ override fun onCreate ( savedInstanceState : Bundle ? ) {
45
+ super .onCreate(savedInstanceState)
46
+ (requireActivity().application as WordPress ).component().inject( this )
48
47
}
49
48
50
- override fun setupContent (rootView : ViewGroup ) {
51
- searchInputWithHeader = SearchInputWithHeader (
52
- uiHelpers = uiHelpers,
53
- rootView = rootView,
54
- onClear = { viewModel.onClearTextBtnClicked() }
55
- )
56
- rootView.findViewById<AppCompatButton >(R .id.create_site_button).setOnClickListener {
57
- viewModel.createSiteBtnClicked()
58
- }
59
- initRecyclerView()
60
- initViewModel()
49
+ override fun getContentLayout (): Int {
50
+ return R .layout.site_creation_domains_screen
61
51
}
62
52
63
- override fun getScreenTitle () : String {
64
- return arguments?.getString(EXTRA_SCREEN_TITLE )
53
+ override val screenTitle : String
54
+ get() = arguments?.getString(EXTRA_SCREEN_TITLE )
65
55
? : throw IllegalStateException (" Required argument screen title is missing." )
66
- }
67
56
68
- override fun onHelp () {
69
- viewModel.onHelpClicked()
70
- }
71
-
72
- override fun onCreate (savedInstanceState : Bundle ? ) {
73
- super .onCreate(savedInstanceState)
74
- nonNullActivity = requireActivity()
75
- (nonNullActivity.application as WordPress ).component().inject(this )
57
+ override fun setBindingViewStubListener (parentBinding : SiteCreationFormScreenBinding ) {
58
+ parentBinding.siteCreationFormContentStub.setOnInflateListener { _, inflated ->
59
+ binding = SiteCreationDomainsScreenBinding .bind(inflated)
60
+ }
76
61
}
77
62
78
- override fun onViewStateRestored (savedInstanceState : Bundle ? ) {
79
- super .onViewStateRestored(savedInstanceState)
80
- // we need to set the `onTextChanged` after the viewState has been restored otherwise the viewModel.updateQuery
81
- // is called when the system sets the restored value to the EditText which results in an unnecessary request
82
- searchInputWithHeader?.onTextChanged = { viewModel.updateQuery(it) }
63
+ override fun setupContent () {
64
+ binding?.let {
65
+ searchInputWithHeader = SearchInputWithHeader (
66
+ uiHelpers = uiHelpers,
67
+ rootView = it.root as ViewGroup ,
68
+ onClear = { viewModel.onClearTextBtnClicked() }
69
+ )
70
+ it.createSiteButton.setOnClickListener { viewModel.createSiteBtnClicked() }
71
+ it.initRecyclerView()
72
+ it.initViewModel()
73
+ }
83
74
}
84
75
85
- private fun initRecyclerView () {
86
- recycler_view .layoutManager = LinearLayoutManager (activity, RecyclerView .VERTICAL , false )
76
+ private fun SiteCreationDomainsScreenBinding. initRecyclerView () {
77
+ recyclerView .layoutManager = LinearLayoutManager (activity, RecyclerView .VERTICAL , false )
87
78
initAdapter()
88
79
}
89
80
90
- private fun initAdapter () {
81
+ private fun SiteCreationDomainsScreenBinding. initAdapter () {
91
82
val adapter = SiteCreationDomainsAdapter (uiHelpers)
92
- recycler_view .adapter = adapter
83
+ recyclerView .adapter = adapter
93
84
}
94
85
95
- private fun initViewModel () {
96
- viewModel = ViewModelProvider (this , viewModelFactory)
86
+ private fun SiteCreationDomainsScreenBinding. initViewModel () {
87
+ viewModel = ViewModelProvider (this @SiteCreationDomainsFragment , viewModelFactory)
97
88
.get(SiteCreationDomainsViewModel ::class .java)
98
89
99
- viewModel.uiState.observe(this , Observer { uiState ->
90
+ viewModel.uiState.observe(this @SiteCreationDomainsFragment, { uiState ->
100
91
uiState?.let {
101
- searchInputWithHeader?.updateHeader(nonNullActivity , uiState.headerUiState)
102
- searchInputWithHeader?.updateSearchInput(nonNullActivity , uiState.searchInputUiState)
92
+ searchInputWithHeader?.updateHeader(requireActivity() , uiState.headerUiState)
93
+ searchInputWithHeader?.updateSearchInput(requireActivity() , uiState.searchInputUiState)
103
94
updateContentUiState(uiState.contentState)
104
- uiHelpers.updateVisibility(create_site_button_container , uiState.createSiteButtonContainerVisibility)
105
- uiHelpers.updateVisibility(create_site_button_shaddow , uiState.createSiteButtonContainerVisibility)
95
+ uiHelpers.updateVisibility(createSiteButtonContainer , uiState.createSiteButtonContainerVisibility)
96
+ uiHelpers.updateVisibility(createSiteButtonShaddow , uiState.createSiteButtonContainerVisibility)
106
97
updateTitleVisibility(uiState.headerUiState == null )
107
98
}
108
99
})
109
- viewModel.clearBtnClicked.observe(this , Observer {
100
+ viewModel.clearBtnClicked.observe(this @SiteCreationDomainsFragment, {
110
101
searchInputWithHeader?.setInputText(" " )
111
102
})
112
- viewModel.createSiteBtnClicked.observe(this , Observer { domain ->
103
+ viewModel.createSiteBtnClicked.observe(this @SiteCreationDomainsFragment, { domain ->
113
104
domain?.let { (requireActivity() as DomainsScreenListener ).onDomainSelected(domain) }
114
105
})
115
- viewModel.onHelpClicked.observe(this , Observer {
106
+ viewModel.onHelpClicked.observe(this @SiteCreationDomainsFragment, {
116
107
(requireActivity() as OnHelpClickedListener ).onHelpClicked(HelpActivity .Origin .SITE_CREATION_DOMAINS )
117
108
})
118
109
viewModel.start()
119
110
}
120
111
121
- private fun updateContentUiState (contentState : DomainsUiContentState ) {
122
- uiHelpers.updateVisibility(domain_list_empty_view, contentState.emptyViewVisibility)
123
- uiHelpers.updateVisibility(domain_list_example, contentState.exampleViewVisibility)
112
+ private fun SiteCreationDomainsScreenBinding.updateContentUiState (contentState : DomainsUiContentState ) {
113
+ uiHelpers.updateVisibility(domainListEmptyView, contentState.emptyViewVisibility)
114
+ uiHelpers.updateVisibility(siteCreationDomainsScreenExample.root, contentState.exampleViewVisibility)
115
+ (recyclerView.adapter as SiteCreationDomainsAdapter ).update(contentState.items)
116
+
124
117
if (contentState.items.isNotEmpty()) {
125
118
view?.announceForAccessibility(getString(R .string.suggestions_updated_content_description))
126
119
}
127
- (recycler_view.adapter as SiteCreationDomainsAdapter ).update(contentState.items)
128
120
}
129
121
130
122
private fun updateTitleVisibility (visible : Boolean ) {
131
123
val actionBar = (requireActivity() as ? AppCompatActivity )?.supportActionBar
132
124
actionBar?.setDisplayShowTitleEnabled(displayUtils.isLandscapeBySize() || visible)
133
125
}
134
126
127
+ override fun onHelp () {
128
+ viewModel.onHelpClicked()
129
+ }
130
+
131
+ override fun onViewStateRestored (savedInstanceState : Bundle ? ) {
132
+ super .onViewStateRestored(savedInstanceState)
133
+ // we need to set the `onTextChanged` after the viewState has been restored otherwise the viewModel.updateQuery
134
+ // is called when the system sets the restored value to the EditText which results in an unnecessary request
135
+ searchInputWithHeader?.onTextChanged = { viewModel.updateQuery(it) }
136
+ }
137
+
135
138
override fun onDestroyView () {
136
139
super .onDestroyView()
137
140
searchInputWithHeader = null
141
+ binding = null
138
142
}
139
143
140
144
companion object {
0 commit comments