Skip to content

Commit fb0605e

Browse files
authored
Merge pull request #14871 from wordpress-mobile/issue/14845-remove-synthetic-accessors-site-creation
Remove synthetic accessors: Site Creation
2 parents 56a90df + a49ab01 commit fb0605e

12 files changed

+420
-356
lines changed

WordPress/src/main/java/org/wordpress/android/ui/sitecreation/SiteCreationBaseFormFragment.java

Lines changed: 0 additions & 86 deletions
This file was deleted.
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package org.wordpress.android.ui.sitecreation
2+
3+
import android.os.Bundle
4+
import android.view.Menu
5+
import android.view.MenuInflater
6+
import android.view.MenuItem
7+
import android.view.View
8+
import androidx.annotation.LayoutRes
9+
import androidx.appcompat.app.AppCompatActivity
10+
import androidx.fragment.app.Fragment
11+
import org.wordpress.android.R
12+
import org.wordpress.android.databinding.SiteCreationFormScreenBinding
13+
14+
abstract class SiteCreationBaseFormFragment : Fragment(R.layout.site_creation_form_screen) {
15+
@LayoutRes protected abstract fun getContentLayout(): Int
16+
protected abstract val screenTitle: String
17+
protected abstract fun setupContent()
18+
protected abstract fun onHelp()
19+
protected abstract fun setBindingViewStubListener(parentBinding: SiteCreationFormScreenBinding)
20+
override fun onCreate(savedInstanceState: Bundle?) {
21+
super.onCreate(savedInstanceState)
22+
setHasOptionsMenu(true)
23+
}
24+
25+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
26+
super.onViewCreated(view, savedInstanceState)
27+
28+
with(SiteCreationFormScreenBinding.bind(view)) {
29+
siteCreationFormContentStub.layoutResource = getContentLayout()
30+
setBindingViewStubListener(this)
31+
siteCreationFormContentStub.inflate()
32+
33+
setupContent()
34+
35+
(requireActivity() as AppCompatActivity).setSupportActionBar(toolbarMain)
36+
val actionBar = (activity as AppCompatActivity?)!!.supportActionBar
37+
if (actionBar != null) {
38+
actionBar.setDisplayHomeAsUpEnabled(true)
39+
actionBar.title = screenTitle
40+
// important for accessibility
41+
requireActivity().title = screenTitle
42+
}
43+
}
44+
}
45+
46+
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
47+
inflater.inflate(R.menu.menu_site_creation, menu)
48+
}
49+
50+
override fun onOptionsItemSelected(item: MenuItem): Boolean {
51+
if (item.itemId == R.id.help) {
52+
onHelp()
53+
return true
54+
}
55+
return false
56+
}
57+
58+
companion object {
59+
const val EXTRA_SCREEN_TITLE = "extra_screen_title"
60+
}
61+
}

WordPress/src/main/java/org/wordpress/android/ui/sitecreation/domains/SiteCreationDomainsFragment.kt

Lines changed: 58 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,14 @@ package org.wordpress.android.ui.sitecreation.domains
33
import android.content.Context
44
import android.os.Bundle
55
import android.view.ViewGroup
6-
import androidx.annotation.LayoutRes
76
import androidx.appcompat.app.AppCompatActivity
8-
import androidx.appcompat.widget.AppCompatButton
9-
import androidx.fragment.app.FragmentActivity
10-
import androidx.lifecycle.Observer
117
import androidx.lifecycle.ViewModelProvider
128
import androidx.recyclerview.widget.LinearLayoutManager
139
import androidx.recyclerview.widget.RecyclerView
14-
import kotlinx.android.synthetic.main.site_creation_domains_screen.*
1510
import org.wordpress.android.R
1611
import org.wordpress.android.WordPress
12+
import org.wordpress.android.databinding.SiteCreationDomainsScreenBinding
13+
import org.wordpress.android.databinding.SiteCreationFormScreenBinding
1714
import org.wordpress.android.ui.accounts.HelpActivity
1815
import org.wordpress.android.ui.sitecreation.SiteCreationBaseFormFragment
1916
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsUiState.DomainsUiContentState
@@ -23,15 +20,17 @@ import org.wordpress.android.ui.utils.UiHelpers
2320
import org.wordpress.android.util.DisplayUtilsWrapper
2421
import javax.inject.Inject
2522

23+
@Suppress("TooManyFunctions")
2624
class SiteCreationDomainsFragment : SiteCreationBaseFormFragment() {
27-
private lateinit var nonNullActivity: FragmentActivity
2825
private var searchInputWithHeader: SearchInputWithHeader? = null
2926
private lateinit var viewModel: SiteCreationDomainsViewModel
3027

3128
@Inject internal lateinit var viewModelFactory: ViewModelProvider.Factory
3229
@Inject internal lateinit var uiHelpers: UiHelpers
3330
@Inject internal lateinit var displayUtils: DisplayUtilsWrapper
3431

32+
private var binding: SiteCreationDomainsScreenBinding? = null
33+
3534
override fun onAttach(context: Context) {
3635
super.onAttach(context)
3736
if (context !is DomainsScreenListener) {
@@ -42,99 +41,104 @@ class SiteCreationDomainsFragment : SiteCreationBaseFormFragment() {
4241
}
4342
}
4443

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)
4847
}
4948

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
6151
}
6252

63-
override fun getScreenTitle(): String {
64-
return arguments?.getString(EXTRA_SCREEN_TITLE)
53+
override val screenTitle: String
54+
get() = arguments?.getString(EXTRA_SCREEN_TITLE)
6555
?: throw IllegalStateException("Required argument screen title is missing.")
66-
}
6756

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+
}
7661
}
7762

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+
}
8374
}
8475

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)
8778
initAdapter()
8879
}
8980

90-
private fun initAdapter() {
81+
private fun SiteCreationDomainsScreenBinding.initAdapter() {
9182
val adapter = SiteCreationDomainsAdapter(uiHelpers)
92-
recycler_view.adapter = adapter
83+
recyclerView.adapter = adapter
9384
}
9485

95-
private fun initViewModel() {
96-
viewModel = ViewModelProvider(this, viewModelFactory)
86+
private fun SiteCreationDomainsScreenBinding.initViewModel() {
87+
viewModel = ViewModelProvider(this@SiteCreationDomainsFragment, viewModelFactory)
9788
.get(SiteCreationDomainsViewModel::class.java)
9889

99-
viewModel.uiState.observe(this, Observer { uiState ->
90+
viewModel.uiState.observe(this@SiteCreationDomainsFragment, { uiState ->
10091
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)
10394
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)
10697
updateTitleVisibility(uiState.headerUiState == null)
10798
}
10899
})
109-
viewModel.clearBtnClicked.observe(this, Observer {
100+
viewModel.clearBtnClicked.observe(this@SiteCreationDomainsFragment, {
110101
searchInputWithHeader?.setInputText("")
111102
})
112-
viewModel.createSiteBtnClicked.observe(this, Observer { domain ->
103+
viewModel.createSiteBtnClicked.observe(this@SiteCreationDomainsFragment, { domain ->
113104
domain?.let { (requireActivity() as DomainsScreenListener).onDomainSelected(domain) }
114105
})
115-
viewModel.onHelpClicked.observe(this, Observer {
106+
viewModel.onHelpClicked.observe(this@SiteCreationDomainsFragment, {
116107
(requireActivity() as OnHelpClickedListener).onHelpClicked(HelpActivity.Origin.SITE_CREATION_DOMAINS)
117108
})
118109
viewModel.start()
119110
}
120111

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+
124117
if (contentState.items.isNotEmpty()) {
125118
view?.announceForAccessibility(getString(R.string.suggestions_updated_content_description))
126119
}
127-
(recycler_view.adapter as SiteCreationDomainsAdapter).update(contentState.items)
128120
}
129121

130122
private fun updateTitleVisibility(visible: Boolean) {
131123
val actionBar = (requireActivity() as? AppCompatActivity)?.supportActionBar
132124
actionBar?.setDisplayShowTitleEnabled(displayUtils.isLandscapeBySize() || visible)
133125
}
134126

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+
135138
override fun onDestroyView() {
136139
super.onDestroyView()
137140
searchInputWithHeader = null
141+
binding = null
138142
}
139143

140144
companion object {

WordPress/src/main/java/org/wordpress/android/ui/sitecreation/misc/SearchInputWithHeader.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.wordpress.android.ui.sitecreation.misc
22

33
import android.content.Context
4+
import android.os.Handler
45
import android.text.Editable
56
import android.text.TextWatcher
67
import android.view.View
@@ -10,10 +11,9 @@ import android.widget.TextView
1011
import org.wordpress.android.R
1112
import org.wordpress.android.ui.utils.UiHelpers
1213
import org.wordpress.android.util.ActivityUtils
13-
import android.os.Handler
1414

1515
class SearchInputWithHeader(private val uiHelpers: UiHelpers, rootView: View, onClear: () -> Unit) {
16-
private val headerLayout = rootView.findViewById<ViewGroup>(R.id.header_layout)
16+
private val headerLayout = rootView.findViewById<ViewGroup>(R.id.site_creation_header_item)
1717
private val headerTitle = rootView.findViewById<TextView>(R.id.title)
1818
private val headerSubtitle = rootView.findViewById<TextView>(R.id.subtitle)
1919
private val searchInput = rootView.findViewById<EditText>(R.id.input)

0 commit comments

Comments
 (0)