Skip to content

Commit

Permalink
WIP: Add compose view for new domains ui
Browse files Browse the repository at this point in the history
  • Loading branch information
ovitrif committed Feb 23, 2023
1 parent ec483c4 commit 236d18f
Show file tree
Hide file tree
Showing 5 changed files with 101 additions and 5 deletions.
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
package org.wordpress.android.ui.sitecreation.domains

import android.view.ViewGroup
import androidx.compose.ui.platform.ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed
import androidx.core.content.ContextCompat
import androidx.core.view.isInvisible
import androidx.recyclerview.widget.RecyclerView
import androidx.viewbinding.ViewBinding
import org.wordpress.android.R
import org.wordpress.android.databinding.SiteCreationDomainsItemBinding
import org.wordpress.android.databinding.SiteCreationDomainsItemV2Binding
import org.wordpress.android.databinding.SiteCreationSuggestionsErrorItemBinding
import org.wordpress.android.ui.compose.theme.AppTheme
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState.DomainsFetchSuggestionsErrorUiState
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState.DomainsModelUiState
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState.DomainsModelUiState.DomainsModelAvailableUiState
import org.wordpress.android.ui.sitecreation.domains.compose.DomainItem
import org.wordpress.android.ui.utils.UiHelpers
import org.wordpress.android.util.extensions.viewBinding

Expand Down Expand Up @@ -57,4 +61,23 @@ sealed class SiteCreationDomainViewHolder<T : ViewBinding>(protected val binding
container.setOnClickListener { uiState.onClick.invoke() }
}
}

@Suppress("ForbiddenComment")
class DomainComposeItemViewHolder(
parentView: ViewGroup,
) : SiteCreationDomainViewHolder<SiteCreationDomainsItemV2Binding>(
parentView.viewBinding(SiteCreationDomainsItemV2Binding::inflate)
) {
val composeView = binding.composeView

fun onBind(uiState: DomainsModelUiState) = with(composeView) {
// TODO: Remove this for Compose 1.2.0-beta02+ and RecyclerView 1.3.0-alpha02+
setViewCompositionStrategy(DisposeOnViewTreeLifecycleDestroyed)
setContent {
AppTheme {
DomainItem(uiState)
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,21 @@ import android.view.ViewGroup
import androidx.annotation.MainThread
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.RecyclerView.Adapter
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainViewHolder.DomainComposeItemViewHolder
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainViewHolder.DomainSuggestionErrorViewHolder
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainViewHolder.DomainSuggestionItemViewHolder
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState.DomainsFetchSuggestionsErrorUiState
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState.DomainsModelUiState
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState.Type
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState.Type.DOMAIN_V1
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState.Type.DOMAIN_V2
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState.Type.ERROR_FETCH_V1
import org.wordpress.android.ui.utils.UiHelpers

class SiteCreationDomainsAdapter(private val uiHelpers: UiHelpers) : Adapter<SiteCreationDomainViewHolder<*>>() {
class SiteCreationDomainsAdapter(
private val uiHelpers: UiHelpers,
) : Adapter<SiteCreationDomainViewHolder<*>>() {
private val items = mutableListOf<DomainsListItemUiState>()

override fun onCreateViewHolder(
Expand All @@ -23,6 +27,7 @@ class SiteCreationDomainsAdapter(private val uiHelpers: UiHelpers) : Adapter<Sit
): SiteCreationDomainViewHolder<*> {
return when (Type.values()[viewType]) {
DOMAIN_V1 -> DomainSuggestionItemViewHolder(parent, uiHelpers)
DOMAIN_V2 -> DomainComposeItemViewHolder(parent)
ERROR_FETCH_V1 -> DomainSuggestionErrorViewHolder(parent)
}
}
Expand All @@ -32,6 +37,7 @@ class SiteCreationDomainsAdapter(private val uiHelpers: UiHelpers) : Adapter<Sit
return when (holder) {
is DomainSuggestionItemViewHolder -> holder.onBind(item as DomainsModelUiState)
is DomainSuggestionErrorViewHolder -> holder.onBind(item as DomainsFetchSuggestionsErrorUiState)
is DomainComposeItemViewHolder -> holder.onBind(item as DomainsModelUiState)
}
}

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

@Suppress("ForbiddenComment")
override fun onViewRecycled(holder: SiteCreationDomainViewHolder<*>) {
if (holder is DomainComposeItemViewHolder) {
// TODO: Remove this for Compose 1.2.0-beta02+ and RecyclerView 1.3.0-alpha02+
holder.composeView.disposeComposition()
}
super.onViewRecycled(holder)
}

private class DomainsDiffUtils(
val oldItems: List<DomainsListItemUiState>,
val newItems: List<DomainsListItemUiState>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,7 @@ import org.wordpress.android.models.networkresource.ListState.Success
import org.wordpress.android.modules.BG_THREAD
import org.wordpress.android.modules.UI_THREAD
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainSuggestionsQuery.UserQuery
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState.DomainsFetchSuggestionsErrorUiState
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState.DomainsModelUiState
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState.*
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState.DomainsModelUiState.DomainsModelAvailableUiState
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState.DomainsModelUiState.DomainsModelUnavailabilityUiState
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsUiState.DomainsUiContentState
Expand Down Expand Up @@ -282,6 +281,7 @@ class SiteCreationDomainsViewModel @Inject constructor(
domainSanitizer.getName(domain.domainName),
domainSanitizer.getDomain(domain.domainName),
checked = domain == selectedDomain,
type = getDomainsModelAvailableUiStateType(),
onClick = { onDomainSelected(domain) }
)
items.add(itemUiState)
Expand All @@ -290,6 +290,13 @@ class SiteCreationDomainsViewModel @Inject constructor(
return items
}

private fun getDomainsModelAvailableUiStateType(): Type {
return when (purchasingFeatureConfig.isEnabledOrManuallyOverridden()) {
true -> Type.DOMAIN_V2
else -> Type.DOMAIN_V1
}
}

private fun getDomainUnavailableUiState(
query: String,
domains: List<DomainModel>
Expand Down Expand Up @@ -377,6 +384,7 @@ class SiteCreationDomainsViewModel @Inject constructor(

enum class Type {
DOMAIN_V1,
DOMAIN_V2,
ERROR_FETCH_V1,
}

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

data class DomainsModelAvailableUiState(
override val name: String,
override val domain: String,
override val checked: Boolean,
override val type: Type = Type.DOMAIN_V1,
val onClick: () -> Unit,
) : DomainsModelUiState(name, domain, checked, true)

data class DomainsModelUnavailabilityUiState(
override val name: String,
override val domain: String,
override val subTitle: UiString
override val subTitle: UiString,
override val type: Type = Type.DOMAIN_V1,
) : DomainsModelUiState(name, domain, false, false, subTitle)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package org.wordpress.android.ui.sitecreation.domains.compose

import android.content.res.Configuration
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import org.wordpress.android.ui.compose.theme.AppTheme
import org.wordpress.android.ui.sitecreation.domains.SiteCreationDomainsViewModel.DomainsListItemUiState.DomainsModelUiState

@Composable
fun DomainItem(
uiState: DomainsModelUiState,
) = with(uiState) {
Row(
modifier = Modifier
.padding(horizontal = 24.dp, vertical = 16.dp)
)
{
Text(name + domain)
Spacer(modifier = Modifier.weight(1f))
Text("Free")
}
}

@Preview
@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
@Composable
private fun DomainItemPreview() {
val uiState = DomainsModelUiState.DomainsModelAvailableUiState(
name = "name",
domain = "domain",
checked = false,
onClick = {},
)
AppTheme {
DomainItem(uiState)
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<androidx.compose.ui.platform.ComposeView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/compose_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<!-- see DomainItem composable -->

0 comments on commit 236d18f

Please sign in to comment.