For #21658 - Don't pass Client into composable functions

upstream-sync
Gabriel Luong 3 years ago committed by mergify[bot]
parent faab3eb7f1
commit 6abb2fffa1

@ -11,20 +11,14 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import mozilla.components.browser.engine.gecko.fetch.GeckoViewFetchClient
import mozilla.components.concept.fetch.Client
import mozilla.components.concept.fetch.MutableHeaders
import mozilla.components.concept.fetch.Request
import mozilla.components.concept.fetch.Response
import mozilla.components.support.images.compose.loader.ImageLoader
import mozilla.components.support.images.compose.loader.WithImage
import org.mozilla.fenix.components.components
/**
* A composable that lays out and draws the image from a given URL while showing a default placeholder
* while that image is downloaded or a default fallback image when downloading failed.
*
* @param client [Client] instance to be used for downloading the image.
* When using [GeckoViewFetchClient] the image will automatically be cached if it has the right headers.
* @param url URL from where the to download the image to be shown.
* @param modifier [Modifier] to be applied to the layout.
* @param private Whether or not this is a private request. Like in private browsing mode,
@ -37,7 +31,6 @@ import mozilla.components.support.images.compose.loader.WithImage
@Composable
@Suppress("LongParameterList")
fun Image(
client: Client,
url: String,
modifier: Modifier = Modifier,
private: Boolean = false,
@ -46,7 +39,7 @@ fun Image(
) {
ImageLoader(
url = url,
client = client,
client = components.core.client,
private = private,
targetSize = targetSize
) {
@ -68,17 +61,7 @@ fun Image(
@Preview
private fun ImagePreview() {
Image(
FakeClient(),
"https://mozilla.com",
Modifier.height(100.dp).width(200.dp)
)
}
internal class FakeClient : Client() {
override fun fetch(request: Request) = Response(
url = request.url,
status = 200,
body = Response.Body.empty(),
headers = MutableHeaders()
)
}

@ -20,8 +20,6 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import mozilla.components.browser.engine.gecko.fetch.GeckoViewFetchClient
import mozilla.components.concept.fetch.Client
import org.mozilla.fenix.theme.FirefoxTheme
/**
@ -37,8 +35,6 @@ import org.mozilla.fenix.theme.FirefoxTheme
* ---------------------------------------------
* ```
*
* @param client [Client] instance to be used for downloading the image.
* When using [GeckoViewFetchClient] the image will automatically be cached if it has the right headers.
* @param imageUrl URL from where the to download a header image of the tab this composable renders.
* @param title Title off the tab this composable renders.
* @param caption Optional caption text.
@ -46,13 +42,12 @@ import org.mozilla.fenix.theme.FirefoxTheme
*/
@Composable
fun ListItemTabLarge(
client: Client,
imageUrl: String,
title: String,
caption: String? = null,
onClick: (() -> Unit)? = null
) {
ListItemTabSurface(client, imageUrl, onClick) {
ListItemTabSurface(imageUrl, onClick) {
TabTitle(text = title, maxLines = 3)
if (caption != null) {
@ -77,8 +72,6 @@ fun ListItemTabLarge(
* ---------------------------------------------
* ```
*
* @param client [Client] instance to be used for downloading the image.
* When using [GeckoViewFetchClient] the image will automatically be cached if it has the right headers.
* @param imageUrl URL from where the to download a header image of the tab this composable renders.
* @param title Composable rendering the title of the tab this composable represents.
* @param subtitle Optional tab caption composable.
@ -86,13 +79,12 @@ fun ListItemTabLarge(
*/
@Composable
fun ListItemTabLarge(
client: Client,
imageUrl: String,
onClick: () -> Unit,
title: @Composable () -> Unit,
subtitle: @Composable (() -> Unit)? = null
) {
ListItemTabSurface(client, imageUrl, onClick) {
ListItemTabSurface(imageUrl, onClick) {
title()
subtitle?.invoke()
@ -102,15 +94,12 @@ fun ListItemTabLarge(
/**
* Shared default configuration of a ListItemTabLarge Composable.
*
* @param client [Client] instance to be used for downloading the image.
* When using [GeckoViewFetchClient] the image will automatically be cached if it has the right headers.
* @param imageUrl URL from where the to download a header image of the tab this composable renders.
* @param onClick Optional callback to be invoked when this composable is clicked.
* @param tabDetails [Composable] Displayed to the the end of the image. Allows for variation in the item text style.
*/
@Composable
private fun ListItemTabSurface(
client: Client,
imageUrl: String,
onClick: (() -> Unit)? = null,
tabDetails: @Composable () -> Unit
@ -132,7 +121,7 @@ private fun ListItemTabSurface(
.size(imageWidth, imageHeight)
.clip(RoundedCornerShape(8.dp))
Image(client, imageUrl, imageModifier, false, imageWidth)
Image(imageUrl, imageModifier, false, imageWidth)
Spacer(Modifier.width(16.dp))
@ -151,7 +140,6 @@ private fun ListItemTabSurface(
private fun ListItemTabLargePreview() {
FirefoxTheme {
ListItemTabLarge(
client = FakeClient(),
imageUrl = "",
title = "This is a very long title for a tab but needs to be so for this preview",
caption = "And this is a caption"

@ -232,9 +232,8 @@ class SessionControlAdapter(
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
when (viewType) {
PocketStoriesViewHolder.LAYOUT_ID -> return PocketStoriesViewHolder(
ComposeView(parent.context),
store,
components.core.client,
composeView = ComposeView(parent.context),
store = store,
interactor = interactor
)
RecentTabViewHolder.LAYOUT_ID -> return RecentTabViewHolder(

@ -41,7 +41,6 @@ import mozilla.components.ui.colors.PhotonColors
import org.mozilla.fenix.R
import org.mozilla.fenix.compose.ClickableSubstringLink
import org.mozilla.fenix.compose.EagerFlingBehavior
import org.mozilla.fenix.compose.FakeClient
import org.mozilla.fenix.compose.ListItemTabLarge
import org.mozilla.fenix.compose.ListItemTabLargePlaceholder
import org.mozilla.fenix.compose.SelectableChip
@ -64,13 +63,11 @@ private val placeholderStory = PocketRecommendedStory("", "", "", "", "", 0, 0)
* Displays a single [PocketRecommendedStory].
*
* @param story The [PocketRecommendedStory] to be displayed.
* @param client [Client] instance to be used for downloading the story header image.
* @param onStoryClick Callback for when the user taps on this story.
*/
@Composable
fun PocketStory(
@PreviewParameter(PocketStoryProvider::class) story: PocketRecommendedStory,
client: Client,
onStoryClick: (PocketRecommendedStory) -> Unit,
) {
val imageUrl = story.imageUrl.replace(
@ -80,7 +77,6 @@ fun PocketStory(
val isValidPublisher = story.publisher.isNotBlank()
val isValidTimeToRead = story.timeToRead >= 0
ListItemTabLarge(
client = client,
imageUrl = imageUrl,
onClick = { onStoryClick(story) },
title = {
@ -111,7 +107,6 @@ fun PocketStory(
@Composable
fun PocketStories(
@PreviewParameter(PocketStoryProvider::class) stories: List<PocketRecommendedStory>,
client: Client,
onExternalLinkClicked: (String) -> Unit
) {
// Show stories in at most 3 rows but on any number of columns depending on the data received.
@ -135,7 +130,7 @@ fun PocketStories(
onExternalLinkClicked("http://getpocket.com/explore")
}
} else {
PocketStory(story, client) {
PocketStory(story) {
onExternalLinkClicked(story.url)
}
}
@ -235,7 +230,6 @@ private fun PocketStoriesComposablesPreview() {
Column {
PocketStories(
stories = getFakePocketStories(8),
client = FakeClient(),
onExternalLinkClicked = { }
)
Spacer(Modifier.height(10.dp))

@ -18,7 +18,6 @@ import androidx.compose.ui.platform.ViewCompositionStrategy
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.recyclerview.widget.RecyclerView
import mozilla.components.concept.fetch.Client
import mozilla.components.lib.state.ext.observeAsComposableState
import mozilla.components.service.pocket.PocketRecommendedStory
import org.mozilla.fenix.R
@ -35,13 +34,11 @@ internal const val POCKET_CATEGORIES_SELECTED_AT_A_TIME_COUNT = 8
*
* @param composeView [ComposeView] which will be populated with Jetpack Compose UI content.
* @param store [HomeFragmentStore] containing the list of Pocket stories to be displayed.
* @param client [Client] instance used for the stories header images.
* @param interactor [PocketStoriesInteractor] callback for user interaction.
*/
class PocketStoriesViewHolder(
val composeView: ComposeView,
val store: HomeFragmentStore,
val client: Client,
val interactor: PocketStoriesInteractor
) : RecyclerView.ViewHolder(composeView) {
@ -53,7 +50,6 @@ class PocketStoriesViewHolder(
FirefoxTheme {
PocketStories(
store,
client,
interactor::onStoriesShown,
interactor::onCategoryClick,
interactor::onExternalLinkClicked
@ -70,7 +66,6 @@ class PocketStoriesViewHolder(
@Composable
fun PocketStories(
store: HomeFragmentStore,
client: Client,
onStoriesShown: (List<PocketRecommendedStory>) -> Unit,
onCategoryClick: (PocketRecommendedStoriesCategory) -> Unit,
onExternalLinkClicked: (String) -> Unit
@ -101,7 +96,7 @@ fun PocketStories(
Spacer(Modifier.height(17.dp))
PocketStories(stories ?: emptyList(), client, onExternalLinkClicked)
PocketStories(stories ?: emptyList(), onExternalLinkClicked)
Spacer(Modifier.height(24.dp))

Loading…
Cancel
Save