|
|
|
@ -50,6 +50,7 @@ import androidx.compose.ui.text.style.TextOverflow
|
|
|
|
|
import androidx.compose.ui.unit.dp
|
|
|
|
|
import androidx.compose.ui.unit.sp
|
|
|
|
|
import mozilla.components.feature.top.sites.TopSite
|
|
|
|
|
import org.mozilla.fenix.GleanMetrics.Pings
|
|
|
|
|
import org.mozilla.fenix.R
|
|
|
|
|
import org.mozilla.fenix.compose.ContextualMenu
|
|
|
|
|
import org.mozilla.fenix.compose.Favicon
|
|
|
|
@ -62,6 +63,7 @@ import org.mozilla.fenix.settings.SupportUtils
|
|
|
|
|
import org.mozilla.fenix.theme.FirefoxTheme
|
|
|
|
|
import org.mozilla.fenix.wallpapers.WallpaperState
|
|
|
|
|
import kotlin.math.ceil
|
|
|
|
|
import org.mozilla.fenix.GleanMetrics.TopSites as TopSitesMetrics
|
|
|
|
|
|
|
|
|
|
private const val TOP_SITES_PER_PAGE = 8
|
|
|
|
|
private const val TOP_SITES_PER_ROW = 4
|
|
|
|
@ -123,7 +125,7 @@ fun TopSites(
|
|
|
|
|
|
|
|
|
|
for (items in topSitesWindows) {
|
|
|
|
|
Row(modifier = Modifier.defaultMinSize(minWidth = TOP_SITES_ROW_WIDTH.dp)) {
|
|
|
|
|
items.forEach { topSite ->
|
|
|
|
|
items.forEachIndexed { position, topSite ->
|
|
|
|
|
TopSiteItem(
|
|
|
|
|
topSite = topSite,
|
|
|
|
|
menuItems = getMenuItems(
|
|
|
|
@ -134,6 +136,7 @@ fun TopSites(
|
|
|
|
|
onSettingsClicked = onSettingsClicked,
|
|
|
|
|
onSponsorPrivacyClicked = onSponsorPrivacyClicked,
|
|
|
|
|
),
|
|
|
|
|
position = position,
|
|
|
|
|
topSiteColors = topSiteColors,
|
|
|
|
|
onTopSiteClick = { item -> onTopSiteClick(item) },
|
|
|
|
|
onTopSiteLongClick = onTopSiteLongClick,
|
|
|
|
@ -220,15 +223,18 @@ data class TopSiteColors(
|
|
|
|
|
*
|
|
|
|
|
* @param topSite The [TopSite] to display.
|
|
|
|
|
* @param menuItems List of [MenuItem]s to display in a top site dropdown menu.
|
|
|
|
|
* @param position The position of the top site.
|
|
|
|
|
* @param topSiteColors The color set defined by [TopSiteColors] used to style a top site.
|
|
|
|
|
* @param onTopSiteClick Invoked when the user clicks on a top site.
|
|
|
|
|
* @param onTopSiteLongClick Invoked when the user long clicks on a top site.
|
|
|
|
|
*/
|
|
|
|
|
@Suppress("LongParameterList")
|
|
|
|
|
@OptIn(ExperimentalFoundationApi::class)
|
|
|
|
|
@Composable
|
|
|
|
|
private fun TopSiteItem(
|
|
|
|
|
topSite: TopSite,
|
|
|
|
|
menuItems: List<MenuItem>,
|
|
|
|
|
position: Int,
|
|
|
|
|
topSiteColors: TopSiteColors,
|
|
|
|
|
onTopSiteClick: (TopSite) -> Unit,
|
|
|
|
|
onTopSiteLongClick: (TopSite) -> Unit,
|
|
|
|
@ -300,6 +306,12 @@ private fun TopSiteItem(
|
|
|
|
|
showMenu = menuExpanded,
|
|
|
|
|
onDismissRequest = { menuExpanded = false },
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
if (topSite is TopSite.Provided) {
|
|
|
|
|
LaunchedEffect(topSite) {
|
|
|
|
|
submitTopSitesImpressionPing(topSite = topSite, position = position)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -474,6 +486,20 @@ private fun getMenuItems(
|
|
|
|
|
return result
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun submitTopSitesImpressionPing(topSite: TopSite.Provided, position: Int) {
|
|
|
|
|
TopSitesMetrics.contileImpression.record(
|
|
|
|
|
TopSitesMetrics.ContileImpressionExtra(
|
|
|
|
|
position = position + 1,
|
|
|
|
|
source = "newtab",
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
topSite.id?.let { TopSitesMetrics.contileTileId.set(it) }
|
|
|
|
|
topSite.title?.let { TopSitesMetrics.contileAdvertiser.set(it.lowercase()) }
|
|
|
|
|
TopSitesMetrics.contileReportingUrl.set(topSite.impressionUrl)
|
|
|
|
|
Pings.topsitesImpression.submit()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Composable
|
|
|
|
|
@LightDarkPreview
|
|
|
|
|
private fun TopSitesPreview() {
|
|
|
|
|