Skip to content

Commit 236d18f

Browse files
committed
WIP: Add compose view for new domains ui
1 parent ec483c4 commit 236d18f

File tree

5 files changed

+101
-5
lines changed

5 files changed

+101
-5
lines changed

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
11
package org.wordpress.android.ui.sitecreation.domains
22

33
import android.view.ViewGroup
4+
import androidx.compose.ui.platform.ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed
45
import androidx.core.content.ContextCompat
56
import androidx.core.view.isInvisible
67
import androidx.recyclerview.widget.RecyclerView
78
import androidx.viewbinding.ViewBinding
89
import org.wordpress.android.R
910
import org.wordpress.android.databinding.SiteCreationDomainsItemBinding
11+
import org.wordpress.android.databinding.SiteCreationDomainsItemV2Binding
1012
import org.wordpress.android.databinding.SiteCreationSuggestionsErrorItemBinding
13+
import org.wordpress.android.ui.compose.theme.AppTheme
1114
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState.DomainsFetchSuggestionsErrorUiState
1215
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState.DomainsModelUiState
1316
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState.DomainsModelUiState.DomainsModelAvailableUiState
17+
import org.wordpress.android.ui.sitecreation.domains.compose.DomainItem
1418
import org.wordpress.android.ui.utils.UiHelpers
1519
import org.wordpress.android.util.extensions.viewBinding
1620

@@ -57,4 +61,23 @@ sealed class SiteCreationDomainViewHolder<T : ViewBinding>(protected val binding
5761
container.setOnClickListener { uiState.onClick.invoke() }
5862
}
5963
}
64+
65+
@Suppress("ForbiddenComment")
66+
class DomainComposeItemViewHolder(
67+
parentView: ViewGroup,
68+
) : SiteCreationDomainViewHolder<SiteCreationDomainsItemV2Binding>(
69+
parentView.viewBinding(SiteCreationDomainsItemV2Binding::inflate)
70+
) {
71+
val composeView = binding.composeView
72+
73+
fun onBind(uiState: DomainsModelUiState) = with(composeView) {
74+
// TODO: Remove this for Compose 1.2.0-beta02+ and RecyclerView 1.3.0-alpha02+
75+
setViewCompositionStrategy(DisposeOnViewTreeLifecycleDestroyed)
76+
setContent {
77+
AppTheme {
78+
DomainItem(uiState)
79+
}
80+
}
81+
}
82+
}
6083
}

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,21 @@ import android.view.ViewGroup
44
import androidx.annotation.MainThread
55
import androidx.recyclerview.widget.DiffUtil
66
import androidx.recyclerview.widget.RecyclerView.Adapter
7+
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainViewHolder.DomainComposeItemViewHolder
78
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainViewHolder.DomainSuggestionErrorViewHolder
89
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainViewHolder.DomainSuggestionItemViewHolder
910
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState
1011
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState.DomainsFetchSuggestionsErrorUiState
1112
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState.DomainsModelUiState
1213
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState.Type
1314
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState.Type.DOMAIN_V1
15+
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState.Type.DOMAIN_V2
1416
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState.Type.ERROR_FETCH_V1
1517
import org.wordpress.android.ui.utils.UiHelpers
1618

17-
class SiteCreationDomainsAdapter(private val uiHelpers: UiHelpers) : Adapter<SiteCreationDomainViewHolder<*>>() {
19+
class SiteCreationDomainsAdapter(
20+
private val uiHelpers: UiHelpers,
21+
) : Adapter<SiteCreationDomainViewHolder<*>>() {
1822
private val items = mutableListOf<DomainsListItemUiState>()
1923

2024
override fun onCreateViewHolder(
@@ -23,6 +27,7 @@ class SiteCreationDomainsAdapter(private val uiHelpers: UiHelpers) : Adapter<Sit
2327
): SiteCreationDomainViewHolder<*> {
2428
return when (Type.values()[viewType]) {
2529
DOMAIN_V1 -> DomainSuggestionItemViewHolder(parent, uiHelpers)
30+
DOMAIN_V2 -> DomainComposeItemViewHolder(parent)
2631
ERROR_FETCH_V1 -> DomainSuggestionErrorViewHolder(parent)
2732
}
2833
}
@@ -32,6 +37,7 @@ class SiteCreationDomainsAdapter(private val uiHelpers: UiHelpers) : Adapter<Sit
3237
return when (holder) {
3338
is DomainSuggestionItemViewHolder -> holder.onBind(item as DomainsModelUiState)
3439
is DomainSuggestionErrorViewHolder -> holder.onBind(item as DomainsFetchSuggestionsErrorUiState)
40+
is DomainComposeItemViewHolder -> holder.onBind(item as DomainsModelUiState)
3541
}
3642
}
3743

@@ -47,6 +53,15 @@ class SiteCreationDomainsAdapter(private val uiHelpers: UiHelpers) : Adapter<Sit
4753
diffResult.dispatchUpdatesTo(this)
4854
}
4955

56+
@Suppress("ForbiddenComment")
57+
override fun onViewRecycled(holder: SiteCreationDomainViewHolder<*>) {
58+
if (holder is DomainComposeItemViewHolder) {
59+
// TODO: Remove this for Compose 1.2.0-beta02+ and RecyclerView 1.3.0-alpha02+
60+
holder.composeView.disposeComposition()
61+
}
62+
super.onViewRecycled(holder)
63+
}
64+
5065
private class DomainsDiffUtils(
5166
val oldItems: List<DomainsListItemUiState>,
5267
val newItems: List<DomainsListItemUiState>

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

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@ import org.wordpress.android.models.networkresource.ListState.Success
2525
import org.wordpress.android.modules.BG_THREAD
2626
import org.wordpress.android.modules.UI_THREAD
2727
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainSuggestionsQuery.UserQuery
28-
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState.DomainsFetchSuggestionsErrorUiState
29-
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState.DomainsModelUiState
28+
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState.*
3029
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState.DomainsModelUiState.DomainsModelAvailableUiState
3130
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState.DomainsModelUiState.DomainsModelUnavailabilityUiState
3231
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsUiState.DomainsUiContentState
@@ -282,6 +281,7 @@ class SiteCreationDomainsViewModel @Inject constructor(
282281
domainSanitizer.getName(domain.domainName),
283282
domainSanitizer.getDomain(domain.domainName),
284283
checked = domain == selectedDomain,
284+
type = getDomainsModelAvailableUiStateType(),
285285
onClick = { onDomainSelected(domain) }
286286
)
287287
items.add(itemUiState)
@@ -290,6 +290,13 @@ class SiteCreationDomainsViewModel @Inject constructor(
290290
return items
291291
}
292292

293+
private fun getDomainsModelAvailableUiStateType(): Type {
294+
return when (purchasingFeatureConfig.isEnabledOrManuallyOverridden()) {
295+
true -> Type.DOMAIN_V2
296+
else -> Type.DOMAIN_V1
297+
}
298+
}
299+
293300
private fun getDomainUnavailableUiState(
294301
query: String,
295302
domains: List<DomainModel>
@@ -377,6 +384,7 @@ class SiteCreationDomainsViewModel @Inject constructor(
377384

378385
enum class Type {
379386
DOMAIN_V1,
387+
DOMAIN_V2,
380388
ERROR_FETCH_V1,
381389
}
382390

@@ -386,20 +394,21 @@ class SiteCreationDomainsViewModel @Inject constructor(
386394
open val checked: Boolean,
387395
val radioButtonVisibility: Boolean,
388396
open val subTitle: UiString? = null,
389-
override val type: Type = Type.DOMAIN_V1,
390397
) : DomainsListItemUiState() {
391398

392399
data class DomainsModelAvailableUiState(
393400
override val name: String,
394401
override val domain: String,
395402
override val checked: Boolean,
403+
override val type: Type = Type.DOMAIN_V1,
396404
val onClick: () -> Unit,
397405
) : DomainsModelUiState(name, domain, checked, true)
398406

399407
data class DomainsModelUnavailabilityUiState(
400408
override val name: String,
401409
override val domain: String,
402-
override val subTitle: UiString
410+
override val subTitle: UiString,
411+
override val type: Type = Type.DOMAIN_V1,
403412
) : DomainsModelUiState(name, domain, false, false, subTitle)
404413
}
405414

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package org.wordpress.android.ui.sitecreation.domains.compose
2+
3+
import android.content.res.Configuration
4+
import androidx.compose.foundation.layout.Row
5+
import androidx.compose.foundation.layout.Spacer
6+
import androidx.compose.foundation.layout.padding
7+
import androidx.compose.material.Text
8+
import androidx.compose.runtime.Composable
9+
import androidx.compose.ui.Modifier
10+
import androidx.compose.ui.tooling.preview.Preview
11+
import androidx.compose.ui.unit.dp
12+
import org.wordpress.android.ui.compose.theme.AppTheme
13+
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState.DomainsModelUiState
14+
15+
@Composable
16+
fun DomainItem(
17+
uiState: DomainsModelUiState,
18+
) = with(uiState) {
19+
Row(
20+
modifier = Modifier
21+
.padding(horizontal = 24.dp, vertical = 16.dp)
22+
)
23+
{
24+
Text(name + domain)
25+
Spacer(modifier = Modifier.weight(1f))
26+
Text("Free")
27+
}
28+
}
29+
30+
@Preview
31+
@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
32+
@Composable
33+
private fun DomainItemPreview() {
34+
val uiState = DomainsModelUiState.DomainsModelAvailableUiState(
35+
name = "name",
36+
domain = "domain",
37+
checked = false,
38+
onClick = {},
39+
)
40+
AppTheme {
41+
DomainItem(uiState)
42+
}
43+
}
44+
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<androidx.compose.ui.platform.ComposeView xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:id="@+id/compose_view"
3+
android:layout_width="match_parent"
4+
android:layout_height="wrap_content" />
5+
<!-- see DomainItem composable -->

0 commit comments

Comments
 (0)